基于【题解】《算法零基础100讲》(第46讲) 位运算 (异或) 入门我们在进行一些练习
260. 只出现一次的数字 III
我们假设那两个只出现以此的数为x1和x2,我们通过异或运算后可得到一个值x,则x的值为x = x1 ^ x2。那么我们可以比较x1与x2的每一位,找出第一个不同的那一位的位置i,即x1(i) = 0 or 1,x2(i) = 1 or 0,那我们则可以将这一组数据分为两组,即第 i 位为1,和第 i 位为0,对这两组分别进行异或运算,因为相同的数一定会分为同一组,而x1和x2一定不在同一组,所以计算的结果就是x1和x2。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* singleNumber(int* nums, int numsSize, int* returnSize){
int n = 0;
for(int i = 0; i < numsSize; i++){
n ^= nums[i];
}
int div = n == INT_MIN ? n : n & (-n);//找出第一次出现不同数的位置
int* ans = (int*)malloc(sizeof(int) * 2);
ans[0] = 0;ans[1] = 0;
*returnSize = 2;
for(int i = 0; i < numsSize; i++){
if(div & nums[i]){
ans[0] ^= nums[i];
}
else{
ans[1] ^= nums[i];
}
}
return ans;
}
861. 翻转矩阵后的得分
思路分析:
int matrixScore(int** grid, int gridSize, int* gridColSize){
int row = gridSize, col = *gridColSize;
int ans = row * (1 << (col - 1));
for(int i = 1; i < col; i++){
int n = 0;
for(int j = 0; j < row; j++){
if(grid[j][0] == 1){
n += grid[j][i];
}
else{
n += (1 - grid[j][i]);
}
}
int l = fmax(n, row - n);
ans += l * (1 << (col - i - 1));
}
return ans;
}