2022.02.03刷题
作者:互联网
- 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..
标签:03,nums,int,len,st,++,vector,2022.02,刷题 来源: https://www.cnblogs.com/benenzhu/p/15861175.html