歸納0-錯題本-操作技巧
阿新 • • 發佈:2022-05-24
1-排序的用法
- 實現資料的順序排列;
- 在資料有重複時,實現相同資料的聚集(能這樣做的前提是,最終結果與原先的順序無關)。
2-數字字典序
import java.util.ArrayList; class Solution { List<Integer> res = new ArrayList<>(); public List<Integer> lexicalOrder(int n) { int ans = 1; for(int i=0; i<n; i++){ res.add(ans); if(ans * 10 <= n){ ans *= 10; }else{ while(ans%10==9 || ans+1>n){ ans /= 10; } ans++; } } return res; } }
2-1-字典序,邏輯並不像自己想的那麼好寫
import java.util.HashMap; class Solution { public boolean isAlienSorted(String[] words, String order) { HashMap<Character, Integer> cache = new HashMap<>(); for(int i=0; i<order.length(); i++){ cache.put(order.charAt(i), i); } for(int i=0; i<words.length-1; i++){ String word1 = words[i]; String word2 = words[i+1]; int length = Math.min(word1.length(), word2.length()); flag:{ for(int j=0; j<length; j++){ if(word1.charAt(j)==word2.charAt(j)){ continue; }else if(cache.get(word1.charAt(j))>cache.get(word2.charAt(j))){ return false; }else{ break flag; } } if(word1.length()>word2.length()){ return false; } } } return true; } }
3-藉助StringBuilder進行快速序列化(int和char之間的轉換)
//序列化 public String serialize(TreeNode root) { StringBuilder sb = new StringBuilder(); postOrder(root, sb); //System.out.println(sb.toString()); return sb.toString(); } void postOrder(TreeNode root, StringBuilder sb){ if(root==null){ return; } postOrder(root.left, sb); postOrder(root.right, sb); sb.append((char)root.val); //利用java自帶的字符集,進行int->char->string的快速轉換 }
//反序列化
public TreeNode deserialize(String data) {
//System.out.println(dataArray[0]);
LinkedList<Integer> dataList = new LinkedList<>();
for(int i=0; i<data.length(); i++){
dataList.add((int)data.charAt(i)); //利用java自帶的字符集,進行string->char->int的快速轉換
}
//System.out.println(dataList.toString());
return dePostOrder(Integer.MIN_VALUE, Integer.MAX_VALUE, dataList);
}
TreeNode dePostOrder(int minValue, int maxValue, LinkedList<Integer> dataList){
//System.out.println(dataList.peek());
if(dataList.isEmpty() || dataList.getLast()<minValue || dataList.getLast()>maxValue){
return null;
}
TreeNode root = new TreeNode(dataList.removeLast());
root.right = dePostOrder(root.val, maxValue, dataList);
root.left = dePostOrder(minValue, root.val, dataList);
return root;
}
4-python中global的用法
-
背景:46. 全排列
-
總結:全域性變數如果使用global在區域性初始化,不要忘記賦初值
-
在類方法的區域性函式中進行全域性計數,可以採用設定全域性變數和設定例項變數(例項變數相當於物件中的全域性變數,而且用於物件中的區域性函式還不用global、nonlocal修飾),這兩種方式。
-
1,一段會報錯的程式碼
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result = []
length = len(nums)
count = 0 #這裡的count只是定義在類的方法中的一個區域性變數,不是全域性變數(區域性變數count有初值0,全域性變數count沒有)
def backtrack(track, choiceList):
global count #就算這裡將count使用global修飾,但是全域性變數count未賦值
count += 1 #由於count未賦值,所以報錯
print('>'*self.count, track)
if len(track) == length:
result.append(copy.copy(track)) #如果直接使用result.append(track),最後result中的是同一個track
self.count -= 1
print('>'*self.count, 'return', track)
return
for num in choiceList:
track.append(num)
choiceList.remove(num)
backtrack(track, choiceList)
track.remove(num)
choiceList.append(num)
backtrack([], nums)
return result
- 修改方法1
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result = []
length = len(nums)
global count #將區域性變數count設定為全域性變數
count = 0 #給全域性變數count賦初值
def backtrack(track, choiceList):
global count #將count使用global修飾
count += 1 #由於count有初始賦值,所以不會報錯
print('>'*count, track)
if len(track) == length:
result.append(copy.copy(track))
count -= 1
print('>'*count, 'return', track)
return
for num in choiceList:
track.append(num)
choiceList.remove(num)
backtrack(track, choiceList)
track.remove(num)
choiceList.append(num)
backtrack([], nums)
return result
- 修改方法2
count = 0 #這一步相當於設定全域性變數count,並賦初值0
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result = []
length = len(nums)
def backtrack(track, choiceList):
global count #將count使用global修飾
count += 1 #由於count有初始賦值,所以不會報錯
print('>'*count, track)
if len(track) == length:
result.append(copy.copy(track))
count -= 1
print('>'*count, 'return', track)
return
for num in choiceList:
track.append(num)
choiceList.remove(num)
backtrack(track, choiceList)
track.remove(num)
choiceList.append(num)
backtrack([], nums)
return result
- 修改方法3
import copy
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result = []
length = len(nums)
self.count = 0 #將count定義為例項變數
def backtrack(track, choiceList):
self.count += 1 #使用例項變數進行計數
print('>'*self.count, 'track', track)
print('>'*self.count, 'choiceList', choiceList)
if len(track) == length:
result.append(copy.copy(track))
self.count -= 1
print('>'*self.count, 'return', track)
print('>'*self.count, 'result', result)
return
for num in choiceList:
track.append(num)
choiceList.remove(num)
backtrack(track, choiceList)
track.remove(num)
choiceList.append(num)
backtrack([], nums)
print(result)
return result