2022.02.03刷题

  1. leetbook 初级算法.

189. 轮转数组

三次反转了, 所以学一下用 reverse 函数了.

void rotate(vector<int>& nums, int k) {
    int n = nums.size();
    k = k % n;
    reverse(nums.begin(), nums.end());
    reverse(nums.begin(), nums.begin()+k);
    reverse(nums.begin()+k, nums.end());
}

136. 只出现一次的数字

考察异或的性质? x ^ x = 0

因此 所有的数异或一下就能找到了.

int singleNumber(vector<int>& nums) {
    int res = 0;
    for(auto i: nums) res ^= i;
    return res;
}

283. 移动零

简单, 怎么写双指针.

void moveZeroes(vector<int>& nums) {
    int k = 0;
    for(auto i: nums) if(i) nums[k++] = i;
    while(k<nums.size())nums[k++] = 0;
}

36. 有效的数独

模拟题, 是真的恶心...

bool isValidSudoku(vector<vector<char>>& a) {
    int st[100];
    int st2[100];
    int l = 0, r = 0; 
    for(int k = 0; k < 9; k++){
        memset(st, 0, sizeof st);
        for(int i = 0; i < 9; i++){
            char& t = a[k][i];
            if(t != '.'){
                if(st[t]) return false;
                st[t] = true;
            }
        }
    }

    for(int k = 0; k < 9; k++){
        memset(st, 0, sizeof st);
        for(int i = 0; i < 9; i++){
            char& t = a[i][k];
            if(t != '.'){
                if(st[t]) return false;
                st[t] = true;
            }
        }
    }

    for(int i = 0; i < 9; i+=3){
        for(int j = 0; j < 9; j+=3){
            memset(st, 0 , sizeof st);
            for(int x = 0;x<3;x++){
                for(int y = 0;y<3;y++){
                    char& t = a[i+x][j+y];
                    if(t != '.'){
                        if(st[t]) return false;
                        st[t] = true;
                    }
                }
            }
        }
    }
    return true;
}

48. 旋转图像

一个图 斜着对称一下, 然后镜面对称一下........... 就是 90 度.

void rotate(vector<vector<int>>& a) {
    int n = a.size();
    for(int i = 0; i < n; i++){
        for(int j = i+1;j<n;j++) swap(a[i][j],a[j][i]); 
    }

    for(int i = 0; i < n; i++){
        int l = 0, r = n-1;
        while(l<r) swap(a[i][l++],a[i][r--]);
    }
}

28. 实现 strStr()

简单的kmp;

不过当 needle == "" 应该返回 0.

外观数列

双指针 + 模拟题.

string countAndSay(int n) {
    string s = "1";
    n -= 1;
    while (n--) {
        int l = 0, len = 1;
        string s2 = "";
        while (l < s.size()) {
            while (l + len < s.size() && s[l + len] == s[l]) len++;
            s2 += to_string(len);
            s2 += s[l];
            l = l + len;
            len = 1;
        }
        s = s2;
        cout << s << endl;
    }
    return s;
}

19. 删除链表的倒数第 N 个结点

好恶心的边界情况.

凡是头结点会变的情况,加一个dummy..


上一篇:Leetcode-数组学习1


下一篇:CF1062A A Prank