​ leetcode 231 && ​342 && 371 && 318 && 338

本文通过分析LeetCode中5道不同难度级别的算法题,展示了位操作在解决编程问题时的有效性和效率。从2的幂、4的幂的判断到求两整数之和、最大单词长度乘积以及比特位计数,位操作的应用贯穿始终,揭示了它们在处理二进制数据时的强大能力。这些技巧对于提升编程能力和优化算法性能至关重要。
摘要由CSDN通过智能技术生成

 leetcode 231. 2 的幂  easy  

题目描述:

解题思路:

n大于0,且二进制表示只有一个1即可

代码:

//
class Solution {
public:
    bool isPowerOfTwo(int n) {
        return n > 0 && (n & (n -1)) == 0; // n 大于0, 且只有一个1
    }
};

 leetcode 342. 4的幂  easy            

题目描述:

解题思路:

先判断是否2的幂,然后假如是4的幂,唯一的那个1肯定出现在奇数的位置,

所以构造一个整数mask,它的所有偶数二进制位都是 0,所有奇数二进制位都是 1。这样一来,我们将 n 和 mask 进行按位与运算,如果结果为 0,说明 n 二进制表示中的 1 出现在偶数的位置,否则说明其出现在奇数的位置。

代码:

//
class Solution {
public:
    bool isPowerOfFour(int n) {
        return n > 0 && (n & (n-1)) == 0 && (n & 0xaaaaaaaa) == 0;
    }
};

 leetcode 371. 两整数之和   medium          

题目描述:

解题思路:

a ^ b 表示没有考虑进位的情况下两数的和,(a & b) << 1 就是进位。

代码:

//
class Solution {
public:
    int getSum(int a, int b) {
        while (b != 0) {
            unsigned int carry = (unsigned int)(a & b) << 1;
            a = a ^ b;
            b = carry;
        }
        return a;
    }
};

 leetcode 318. 最大单词长度乘积   medium          

题目描述:

  • words[i] 仅包含小写字母

解题思路:

本题主要问题是判断两个字符串是否含相同字符,由于字符串只含有小写字符,总共 26 位,因此可以用一个 32 位的整数来存储每个字符是否出现过。

代码:

//
class Solution {
public:
    int maxProduct(vector<string>& words) {
        
        vector<int> masks(words.size());

        for (int i = 0; i < words.size(); i++){
            int one = 0;
            for (char &c: words[i])
                one |= 1 << (c-'a');
            masks[i] = one;
        }

        int res = 0;
        for (int i = 0; i < words.size(); i++){
            for (int j = i+1; j< words.size(); j++){
                if ((masks[i] & masks[j]) == 0)
                    res = max(res, int(words[i].size() * words[j].size()));
            }
        }

        return res;



    }
};

 leetcode 338. 比特位计数  easy    

题目描述:

解题思路:

对于数字 6(110),它可以看成是 4(100) 再加一个 2(10),因此 dp[i] = dp[i&(i-1)] + 1;

代码:

//
class Solution {
public:
    vector<int> countBits(int n) {
        vector<int> res(n+1);
        for (int i =1; i< n+1; i++){
            res[i] = res[i&(i-1)] + 1;
        }
        return res;

    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值