1. 程式人生 > 其它 >歸納0-錯題本-操作技巧

歸納0-錯題本-操作技巧

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