0
点赞
收藏
分享

微信扫一扫

【C++初阶】第1课—初识c++

冬冬_79d4 2024-11-19 阅读 8
算法

目录

前情提要:如果对一些常见的二进制位运算不熟悉,请看这篇文章: 常见的位运算

1. 判断字符是否唯一

面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode)

在这里插入图片描述

思路:利用位图的思想,定义一个整数来模拟哈希表,根据每个比特位对应的值来映射字符

在这里插入图片描述

代码实现:

class Solution {
    public boolean isUnique(String astr) {        
        int BitMap = 0;
        int n = astr.length();
        if(n > 26){
            return false;
        }
        for(int i=0;i<n;i++) {
            char ch = astr.charAt(i);
            
            if(((BitMap>>(ch-'a')) & 1)==1){
                return false;
            } else {
                BitMap |= (1<<(ch-'a'));
            }
        }
        return true;
    }
}

2. 消失的数字

268. 丢失的数字 - 力扣(LeetCode)

在这里插入图片描述

思路:

在这里插入图片描述

代码实现:

class Solution {
    public int missingNumber(int[] nums) {
        // 异或运算
        int n = nums.length;
        int ret = 0;
        for(int i=0;i<=n;i++){
            ret^=i;
        }
        for (int i = 0; i < n; i++) {
            ret ^= nums[i];
        }
        return ret;

        // int n = nums.length;
        // //高斯求和
        // int sum = ((n)*(n+1))/2;
        // int numsSum = 0;
        // for(int i=0;i<nums.length;i++) {
        // numsSum += nums[i];
        // }
        // return sum - numsSum;
    }
}

3. 两整数之和

371. 两整数之和 - 力扣(LeetCode)

在这里插入图片描述

思路:

1、让这两个数a、b无进位相加(异或)所得结果x

2、a和b按位与所得结果carry

3、a=x,b=carry

4、a和b无进位相加(疑惑)

循环上面步骤直到b为0,此时相加结果是a

class Solution {
    public int getSum(int a, int b) {
        while(b!=0){
            int x = a^b;//先计算无进位相加
            int carry = (a & b)<<1;
            a = x;
            b = carry;
        }
        return a;
    }
}

4. 只出现一次的数字II

137. 只出现一次的数字 II - 力扣(LeetCode)

在这里插入图片描述

思路:

在这里插入图片描述

定义一个变量ret,依次计算nums数组中第i位的和sum,接着让sum%3,根据结果对应的值修改ret对应比特位的值

class Solution {
    public int singleNumber(int[] nums) {
        int ret = 0;
        for(int i=0;i<32;i++){//依次修改ret中的每一位
            int sum = 0;
            for(int j=0;j<nums.length;j++){
                sum+= ((nums[j]>>i)&1);//计算第i位的和
            }
            sum%=3;
            if(sum==1){
                //修改第i位置的值
                ret |= (1<<i);
            }
        }
        return ret;
    }
}

5. 消失的两个数字

面试题 17.19. 消失的两个数字 - 力扣(LeetCode)

在这里插入图片描述

思路:

在这里插入图片描述

class Solution {
    public int[] missingTwo(int[] nums) {
        int len = nums.length;
        int N = len + 2;
        int ret = 0;
        for (int i = 0; i < nums.length; i++) {
            ret ^= nums[i];
        }
        for (int i = 1; i <= N; i++) {
            ret ^= i;
        }
        // ret为消失的两个数^的结果
        int lowBit = ret & (-ret);
        int[] ans = new int[2];
        ans[0] = 0;
        ans[1] = 0;
        for (int i = 1; i <= N; i++) {
            if ((i & lowBit) != 0) {
                ans[0] ^= i;
            } else {
                ans[1] ^= i;
            }
        }
        for (int i = 0; i < nums.length; i++) {
            if ((nums[i] & lowBit) != 0) {
                ans[0] ^= nums[i];
            } else {
                ans[1] ^= nums[i];
            }
        }
        return ans;
    }
}
举报

相关推荐

0 条评论