力扣单周赛
一.找出中枢整数
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<vector<int>> onesMinusZeros(vector<vector<int>>& grid) {
vector<vector<int>>ans(grid.size(), vector<int>(grid[0].size(), 0));
vector<int>onesRowi(grid.size(), 0);
vector<int>onesColj(grid[0].size(), 0);
vector<int>zerosRowi(grid.size(), 0);
vector<int>zerosColj(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<bits/stdc++.h>
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 <bits/stdc++.h>
using namespace std;
int n, m, m1;
int cha(int n){
int l = 1; int r = 1e9;
while(l<r){
int mid = (l + r) >> 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;
}