第一题:6192. 公因子的数目
思路:暴力,遍历一遍符合条件的加入结果即可
class Solution { public: int commonFactors(int a, int b) { int mi = min(a,b); vector<int> res; for(int i = 1; i <= mi; i++){ if(a % i == 0 && b % i == 0) res.push_back(i); } return res.size(); } };
第二题:6193. 沙漏的最大总和
思路:由于数据范围不大,暴力,两层循环求最大值即可
class Solution { public: int maxSum(vector<vector<int>>& grid) { int n = grid.size(), m = grid[0].size(); int res = 0; for(int i = 1; i < n - 1; i++){ for(int j = 1; j < m - 1; j++){ res = max(res,grid[i][j] + grid[i-1][j-1] + grid[i-1][j] + grid[i-1][j+1] + grid[i+1][j-1] + grid[i+1][j] + grid[i+1][j+1]); } } return res; } };
第三题:6194. 最小 XOR
思路:题目意思开始不太懂,看了题解才明白转化为二进制来看就好懂了。异或运算是相同为0不同为1,就是如果和num1完全相同就是异或运算后最小的,题目又要求置位数和num2相同,也就是1的个数,如果num1的置位数少于num2,就需要补,即从后往前遍历,将num1为0的改成1直到两者置位数相同就达到题目要求,反之,多于num2则从前向后将num1的1改成0直到两者置位数相同,或者将num1还是从后往前遍历,记录1的个数直到两者置位数相同就停止并赋给答案即可。
可以用cnt记录num2的1的数量,然后对num1进行扫描,扫描完毕后根据思路分情况讨论即可
class Solution { public: int minimizeXor(int num1, int num2) { int cnt = 0; int res = 0; int cnt1 = 0; while(num2){ num2 -= num2 & -num2;//num2 & -num2 得到num2最后一位一,每次减去直到没一 cnt++; } for(int i = 0; i < 32; i++){ if(num1 >> i & 1) cnt1 ++; } if(cnt == cnt1) res = num1; else if(cnt < cnt1){ for(int i = 31; i >= 0; i--){ if(!cnt) break; if(num1 >> i & 1){ cnt--; res += 1 << i; } } } else { int k = cnt - cnt1; for(int i = 0; i < 32; i++){ if(!k) break; if(!(num1 >> i & 1)){ k--; num1 += 1 << i; } } res = num1; } return res; } };