力扣第321场周赛+力扣第92场双周赛+AcWing第79场周赛补题

力扣单周赛

一.找出中枢整数

1.原题链接:力扣

2.解题思路:

        先用ans表示从1到n的累加和,再进行循环。用res表示从1到 i 的累加和,若满足res == ans - res + i,则 i 即为中枢整数,返回 i 即可,否则返回-1;

3.参考代码:

class Solution {
public:
    int pivotInteger(int n) {
        if(n == 1){return 1;}
        int ans = 0;
        int x; 
        for(int i = 1; i <= n; i++){
            ans += i;
        }
        int res = 0;
        for(int i = 1; i <= n; i++){
           res += i;
            if(res == ans - res + i){return i;}
        }
        return -1;
    }
};

二.追加字符以获得子序列

1.原题链接:力扣

2.解题思路:

        按顺序若s中有t中的字母,则k++,若没有t中的下一个字母,则返回t的长度减k;

3.参考代码:

class Solution {
public:
    int appendCharacters(string s, string t) {
        int k = 0;
        for(int i = 0; i < s.size(); i++){
            if(s[i] == t[k])k++;
        }
        return t.size() - k;
    }
};

力扣双周赛

一.分割圆的最少切割次数

1.原题链接:力扣

2.解题思路:

        找规律。若n为奇数,则直接输出n;若n为偶数,则输出n / 2;特例:当n == 1,即分成一等分时,不用进行有效切割,直接输出0即可;

3.参考代码:

class Solution {
public:
    int numberOfCuts(int n) {
        if(n == 1)return 0;
        if(n % 2 == 0)return n / 2;
        if(n % 2)return n;
        return 0;
    }
};

二.行和列中一和零的差值

1.原题链接:力扣

2.解题思路:

        先用四个一维数组分别统计每一行中1的个数,每一列中1的个数,每一行中零的个数,每一列中零的个数,数组的下标对应的是第几行/列,最后相加相减即可;

3.参考代码:

class Solution {
public:
    vector> onesMinusZeros(vector>& grid) {
        vector>ans(grid.size(), vector(grid[0].size(), 0));
        vectoronesRowi(grid.size(), 0);
        vectoronesColj(grid[0].size(), 0);
        vectorzerosRowi(grid.size(), 0);
        vectorzerosColj(grid[0].size(), 0);
        for(int i = 0; i < grid.size(); i++){
            for(int j = 0; j < grid[0].size(); j++){
                if(grid[i][j] == 1){
                    onesRowi[i] += 1;
                    onesColj[j] += 1;
                }
                if(grid[i][j] == 0){
                    zerosRowi[i] += 1;
                    zerosColj[j] += 1;
                }
            }
        }
        for(int i = 0; i < grid.size(); i++){
            for(int j = 0; j < grid[0].size(); j++){
                ans[i][j] = onesRowi[i] + onesColj[j] - zerosRowi[i] - zerosColj[j];
            }
        }
        return ans;
    }
};

AcWing

一.数列元素

1.原题链接:4722. 数列元素 - AcWing题库

2.解题思路:

        一层for循环,用ans表示1 + 2 + ....i 的累加和,若ans == n,则输出YES;否则输出NO;

3.参考代码:

#include
using namespace std;

int main()
{
    int n;
    cin >> n;
    int ans = 0;
    for(int i = 1; i <= 500; i++){
        ans += i;
        if(ans == n){cout << "YES";return 0;}
    }
    cout << "NO";
    return 0;
}

二.队列

1.原题链接:4723. 队列 - AcWing题库

2.解题思路:

        第一组5个元素,第二组10个元素,第三组20个元素,以此类推,每组元素个数是等比数列,由等比数列求和公式:S = 5 * (2 ^ n - 1)可算出第n个数是在第几组的(二分法),cha()函数返回的是第n个数在第几组,(n - 5 * (pow(2, m1) - 1 ))可算出第n个数在当前组的元素序号,ceil((n-5*(pow(2,m1)-1))/pow(2,m1))是abcde的序号,用string a输出字符abcde即可;

3.参考代码:

#include 

using namespace std;

int n, m, m1;
int cha(int n){
    int l = 1; int r = 1e9;
    while(l> 1;
        if((pow(2, mid)-1) * 5 >= n) r = mid;
        else l = mid + 1;
    }
    return l;
}
int main(){
    string a = "Oabcde";
    cin >> n;
    m = cha(n), m1 = m - 1;
    cout << a[ceil((n - 5 * (pow(2, m1) - 1))/pow(2, m1))] << endl;
    
    return 0;
}

你可能感兴趣的:(leetcode,算法,c++)