程序员面试金典5.*

5.1插入

在这里插入图片描述
其实就是一个简单的二进制的处理,pass

class Solution {
    public int insertBits(int N, int M, int i, int j) {
        //就一位一位的去做
        int ans=0,bit;
        M<<=i;
        for(int k=0;k<32;k++){
            if(k>=i && k<=j){
                bit=M&(1<<k);
            }else{
                bit=N&(1<<k);
            }
            ans+=bit;
        }
        return ans;

    }
}

取一个二进制位就是去&对应的(1<<k)

5.2 二进制数转字符串

在这里插入图片描述
用的计算机组成原理的那个十进制转二进制(小数层面)的方法。pass

class Solution {
    public String printBin(double num) {
        StringBuilder sb=new StringBuilder("0.");
        for(int i=0;i<33;i++){
            num*=2;
            if(num>=1){
                sb.append("1");
                num-=1;
            }else{
                sb.append("0");
            }
            if(num==0) break;
            
        }
        if(sb.length()>32) return "ERROR";
        return sb.toString();


    }
}

5.3 翻转数位

在这里插入图片描述
pre是之前的有多少个1
cur是现在的有多少个1
如果num是32个1组成的,则要进行res>32的处理

class Solution {
    public int reverseBits(int num) {
        int res=0,cur=0,pre=0;
        for(int i=0;i<32;i++){
            if((num&1)==1) cur++;
            else {
                pre=cur;
                cur=0;
            }
            num=num>>1;
            res=Math.max(res,pre+cur+1);
        }
        if(res>32) return 32;
        return res;

    }
}

5.4下一个数

在这里插入图片描述

思路:
找到稍微大的数:
找到第一个01变成10

最简单情况 …00000111 从低位到高位,找到第一个01变成10 0000 0111->0000 1011即可
复杂情况 …0011 1000 找到第一个01变成10以后,把低位的1右移 0011 1000->01011000->0100 0011第三个数是稍微大的,符合题意
找到稍微小的数:
找到第一个10变成01

最简单情况 …1110 0000 从低位到高位,找到第一个10变成01 1110 0000->1101 0000即可
复杂情况 …1110 0011 找到第一个10变成01以后,把低位的1左移 1110 0011->1101 0011->1101 1100 第三个数符合题意。

5.6整数转换

在这里插入图片描述

异或,查1的个数

return Integer.bitCount(A^B);

或者详细点可以这么写

int convertInteger(int A, int B){
    unsigned int xor = A ^ B, res = 0;  // 注意:A:0101,B:1010
    while (xor != 0) {
        xor = xor & (xor - 1);  // 消除低位1的操作
        res += 1;
    }
    return res;
}

5.7配对交换

在这里插入图片描述

 return ((num & 0x55555555) << 1) | ((num & 0xaaaaaaaa) >> 1);

0x55555555 = 1010101010101010101010101010101 (偶数位为0,奇数位为1)
0xaaaaaaaa = 10101010101010101010101010101010 (偶数位为1,奇数位为0)
十六进制,一个a或者5代表右边4位

5.8绘制直线

题目晦涩难懂,算了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值