LeetCode191-位1的个数(题目有问题)

Posted 朋友圈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode191-位1的个数(题目有问题)相关的知识,希望对你有一定的参考价值。

和1做与运算,结果为1的那一位就是1,不断右移

第一个版本

public static int hammingWeight(int n) {
        int count = 0;
        while(n!=0){
            if((n&1)==1)
                count++;
            n=n>>1;
        }
        return count;
    }

 

超时了?

 

 

 自己输几个用例

 

 

我不懂!题目函数的参数是int,为什么会有这种用例,这不是题目的错误吗。在编辑器里面根本都过不了

 

 

 

我把里面的n转化成long也不行

 

 

我把函数参数改成long也不行???

 

为什么还会显示Integer?

明明这个时候还是long

 

 我懂了,应该是java默认输入的参数都是int类型的

 

 

 

服了,这是什么BUG题目,真强

 

 假如题目是long,那么只要移位即可。使用int毫无意思,java里面没有unsigned int。

后来想到int的最大值是2147483647,那么2147483649是2147483647+1,用int肯定传不进来的,但是题目模范就是int。

没法

2147483647是整数里面最大的,就是0 1111111111111111111111111111111111111111111111111111111111(乱打的1,没数多少)

那么2147483648就是 0 11111111111111111111111111111 + 1 = 1 000000000000000000000000

因为最前面的1位是1,所以右移的话,左边是补1的,不会等0,所以导致了前面的超时!

太恶心了。

这个时候,1 000000000000000000000 是 -0 就是 0

这个不是补码,而是乱来

1 00000000000000000000001 呢 2147483649 要怎么算呢?

或许能用2147483649 - 2147483647 - 1 ?

无论怎么算,都没法找到好的方法。

 

但是有一种方法可以完美解决这种问题。

不是用原数据来移位。

就是改变用来与运算的值。1,10,100,1000,10000 .。。。。。。。。。。。 这样就能不断的从右往左去比较了!

一开始是负数的情况使用的,后来发现无论是整数还是负数都管用!

 

0 11111111111111111111111111111  比如判断第五位 使用 10000 ,只要与运算之后,结果是10000就行了,只关注第五位,其他的不管,就是和

0 0000000000000000000010000 运算

 

public int hammingWeight(int n) {
        int i = 0;
            int test = 1;
            int count = 0;
            while(i<32){

                if((n&test)==test)
                    count++;

                test=test<<1;
                i++;

            }

            return count;
    }

 

 

说到底,还是题目的int太恶心了,明明是int是无法通过的,为了不让使用long,就用int来误导别人。

以上是关于LeetCode191-位1的个数(题目有问题)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode-位1的个数-题号191-Java实现

LeetCode 191. 位1的个数

leetcode刷题笔记191 位1的个数

LeetCode 191.位1的个数

leetcode每日一题-191:位1的个数

LeetCode(算法)- 191. 位 1 的个数