【数据结构C++】位运算(八)

7. 位运算

在这里插入图片描述

  • 只出现一次的数字: https://leetcode-cn.com/problems/single-number/
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    class Solution {
    public:
        int singleNumber(vector<int>& nums) {
            int ret = 0;
            for (auto e: nums) ret ^= e;
            return ret;
        }
    };
    

    在这里插入图片描述

  • 丢失的数字: https://leetcode-cn.com/problems/missing-number/
    在这里插入图片描述
    在这里插入图片描述

    class Solution {
    public:
        int missingNumber(vector<int>& nums) {
            int res = 0;
            int n = nums.size();
            for (int i = 0; i < n; i++) {
                res ^= nums[i];
            }
            for (int i = 0; i <= n; i++) {
                res ^= i;
            }
            return res;
        }
    };
    

    在这里插入图片描述

  • 只出现一次的数字 III: https://leetcode-cn.com/problems/single-number-iii/
    在这里插入图片描述
    在这里插入图片描述

    class Solution {
    public:
        vector<int> singleNumber(vector<int>& nums) {
            int xorsum = 0;
            for (int num: nums) {
                xorsum ^= num;
            }
            // 防止溢出
            int lsb = (xorsum == INT_MIN ? xorsum : xorsum & (-xorsum));
            int type1 = 0, type2 = 0;
            for (int num: nums) {
                if (num & lsb) {
                    type1 ^= num;
                }
                else {
                    type2 ^= num;
                }
            }
            return {type1, type2};
        }
    };
    

    在这里插入图片描述

  • 最大单词长度乘积: https://leetcode-cn.com/problems/maximum-product-of-word-lengths/
    在这里插入图片描述
    在这里插入图片描述

    //mask 计算
    //要获取 111111111,将 0 取反即可,~0。
    //要得到只有第 i 位为 1 的 mask,将 1 向左移动 i-1 位即可,1<<(i-1) 。例如 1<<4 得到只有第 5 位为 1 的 mask:00010000。
    //要得到 1 到 i 位为 1 的 mask,(1<<i)-1 即可,例如将 (1<<4)-1 = 00010000-1 = 00001111。
    //要得到 1 到 i 位为 0 的 mask,只需将 1 到 i 位为 1 的 mask 取反,即 ~((1<<i)-1)。
    
    class Solution {
    public:
        int maxProduct(vector<string>& words) {
            int length = words.size();
            vector<int> masks(length);
            for (int i = 0; i < length; i++) {
                string word = words[i];
                int wordLength = word.size();
                for (int j = 0; j < wordLength; j++) {
                    masks[i] |= 1 << (word[j] - 'a');
                }
            }
            int maxProd = 0;
            for (int i = 0; i < length; i++) {
                for (int j = i + 1; j < length; j++) {
                    if ((masks[i] & masks[j]) == 0) {
                        maxProd = max(maxProd, int(words[i].size() * words[j].size()));
                    }
                }
            }
            return maxProd;
        }
    };
    

    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只搬烫手的砖

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值