【题解】《算法零基础100讲》(第47讲) 位运算 (异或) 进阶

基于【题解】《算法零基础100讲》(第46讲) 位运算 (异或) 入门我们在进行一些练习

260. 只出现一次的数字 III

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. 翻转矩阵后的得分

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;
}

推荐题目

1442. 形成两个异或相等数组的三元组数目

Guess you like

Origin blog.csdn.net/qq_53060585/article/details/121780369