<<代码思路进阶>>题你会?面试为什么不过?看这两个题你就知道了 ###一个优秀程序员必备###

本文介绍了两种优化算法来计算二进制数中1的个数,包括基础解法的改进和最优解,其中最优解利用按位与运算高效地解决问题。此外,还探讨了如何确定一个数的每一位数值,并提出了处理未知位数的策略。最后,通过示例展示了如何判断一个数是否为2的幂次方,提供了一种面试中令面试官眼前一亮的解题思路。
摘要由CSDN通过智能技术生成

📢📢📢📣📣📣
可能这些代码你都会!!!🐂

但是这些解法你一定没见过,仔细看下去,你会发现一些🐂皮的高效率方法!!
如果对你有帮助,欢迎关注我评论点赞哦,顺着评论区回访!!!😀😀😀

目录

第一题:一个二进制数中1的个数

🥚🥚1.基础解法,我想我们都会对的循环&1右移

🎂🎂2.思路进阶:循环32次,没必要啊!!

🐂🐂3.最优解

第二题:求出一个数的每一位是几

🥚🥚1.普通人

🐂🐂2.进阶,你有没有想过 你不知道这是几位数的时候怎么办??


第一题:一个二进制数中1的个数

1.基础解法,我想我们都会对的循环&1右移

思路:与1按位或 然后右移循环,32次;

看代码:

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();//输入一个数
        int count = 0;//用来存放1的数目
        for(int i=0;i<32;i++){
            if((a&1)==1){
                count++;
            }
            a>>=1;//每次a右移一下判断另一个位
        }
        System.out.println(a+"的二进制位中1的个数是:"+count);
    }

2.思路进阶:通常小的数高位都是,循环32次没有必要,我们可以按照这个思路增加代码效率

看代码:

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();//输入一个数
        int count = 0;//用来存放1的数目
        for(int i=0;i<32;i++){
            if((a&1)==1){
                count++;
            }
            a>>=1;//每次a右移一下判断另一个位
            if(a==0){//a==0的适合就没有二进制位为1的数直接break就行
                break;
            }
        }
        System.out.println(a+"的二进制位中1的个数是:"+count);
    }

3.最优解

思路:我们拿7举例子,我们只需要每次跟自己小1的数进行按位与,这样每次会与掉一个1         我们只需要求出等于0的适合按位与了多少次,这样再进阶思路的基础上又简化了代码

 看代码:

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();//输入一个数
        int count = 0;//用来存放1的数目
        while(a!=0){
            a = a & (a-1);
            count++;
        }
        System.out.println(count);
    }

此方法的一个百度面试题:

判断一个正整数是不是2的k次方?你的第一思路是什么?就让他除以2吗?笨方法你肯定能做出来,但你肯定也没有回答到面试官的心里!!!!

思路:2的k次方有那些数??1  2  4  8  16  32  64.......有没有发现什么?他们的二进制位都只有一个1,那我们就可以通过上面的方法破解了!让面试官拍案叫绝!

上代码:

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();//输入一个数
        if(0==( a&(a-1)  ) ){//如果他不是2的k次方,那么他&之后一定不是0
                            //只有二进制位只有一个1的数的&一次就会变成0
            System.out.println("这个数是2的k次方");
        }
    }

第二题:求出一个数的每一位是几

1.普通人

    public static void main(String[] args) {
        n=1234;
        int a = 1234/1000;//求出1
        int b = (n-a*1000)/100;//求出2
        int c = (n-a*1000-a*100)/10;//求出3
        int d = a%10;//求出4
    }

2.进阶,你有没有想过 你不知道这是几位数的时候怎么办??

思路:      第一步,求出这是一个几位数,用除10的方法

                 第二步,求出每一位是几?求余10

                将两步结合!!!看代码:

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();//假设a=1234
        int tmp=a;//找一个替罪羊,防止a的值被修改
        while(tmp!=0){//tmp==0代表每一位都已经输出了
            System.out.println(tmp%10+" ");//求出4
            tmp/=10;//将4去掉,tmp变成了123
        }
    }

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

shn!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值