博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode:Number of 1 Bits - 整数的汉明重量
阅读量:5931 次
发布时间:2019-06-19

本文共 1725 字,大约阅读时间需要 5 分钟。

hot3.png

1、题目名称

Number of 1 Bits(整数的汉明重量)

2、题目地址

3、题目内容

英文:Write a function that takes an unsigned integer and returns the number of ’1' bits it has.

中文:写一个函数,输入一个无符号整数,返回其中值为1的比特位的个数(这个值也被称为数字汉明重量)

例如,32位整型数字11的可以用二进制数字“00000000000000000000000000001011”表示,它的汉明重量就是3。

4、解题方法

本问题可以使用位运算来解决。每次循环都将数字右移一位,然后观察移位后的数字是奇数还是偶数,如果是奇数说明最后一位是1,否则说明最后一位是0。当最后输入的数字经过不断的右移变为0时,结束循环。

一开始我写的代码是这样的:

/** * 功能说明:LeetCode 191 - Number of 1 Bits * 开发人员:Tsybius2014 * 开发时间:2015年8月12日 */public class Solution {    /**     * 求数字的汉明重量     * @param n 数字     * @return 汉明重量     */    public int hammingWeight(int n) {                int counter = 0;        while (n != 0)        {            if (n % 2 != 0) {                counter++;            }            n = n >> 1;        }        return counter;    }}

不过这段“看上去没有什么问题”的代码在提交后会爆出TLE(Time Limit Exceeded)的错误。

后来我找了一下原因,发现导致判定出错时输入为2147483648,但这个输入超过了Java语言中整型的上限。后来我看了一下其他语言的题目,比如C++是这样的:

class Solution {public:    int hammingWeight(uint32_t n) {       }};

原来问题就出在输入可能是无符号数字上!当输入为2147483648时,Java会将这个数字判断位-1,而右移符号>>在计算时会保持数字的符号位,即正数右移高位补0,负数右移高位补1。使用这种规则进行右移,会导致数字在右移过程中被不断补1,这样循环永远无法停止!因此,如果输入为负数,也应该保持右移时高位补0,位运算符>>>可以帮助我们解决这个问题。

一段可以AC的Java代码如下:

/** * 功能说明:LeetCode 191 - Number of 1 Bits * 开发人员:Tsybius2014 * 开发时间:2015年8月12日 */public class Solution {    /**     * 求数字的汉明重量     * @param n 数字     * @return 汉明重量     */    public int hammingWeight(int n) {                int counter = 0;        while (n != 0)        {            if (n % 2 != 0) {                counter++;            }            n = n >>> 1;        }        return counter;    }}

附:Java中的三个用于移位的位运算符:>>、<<、>>>

  1. >>是带符号右移,负数高位补1,正数补0

  2. <<左移不管负数还是正数,在低位永远补0

  3. >>>是不带符号右移,不论负数还是正数,高位补0

END

转载于:https://my.oschina.net/Tsybius2014/blog/491381

你可能感兴趣的文章
Python3 注释
查看>>
老树开新花:DLL劫持漏洞新玩法
查看>>
关于LVS负载均衡tcp长连接分发的解决思路
查看>>
LeetCode Recover Binary Search Tree
查看>>
SpringMVC的页面几种返回方式
查看>>
优盘复制大文件
查看>>
scrapy 6023 telnet查看爬虫引擎相关状态
查看>>
关于最小生成树,拓扑排序、强连通分量、割点、2-SAT的一点笔记
查看>>
[iOS]查看苹果支持的所有字库
查看>>
TCP/IP协议层
查看>>
理解SQLNET.AUTHENTICATION_SERVICES参数|转|
查看>>
new Option及用法
查看>>
C#:基于WMI查询USB设备
查看>>
par函数family参数-控制文字的字体
查看>>
程序员考证之信息系统项目管理师
查看>>
Custom Tabbed Toolbar with Corporate Image and Central Registry Integration
查看>>
HttpWebRequest模拟POST提交防止中文乱码
查看>>
Bring Your Heart to Work
查看>>
android 手动打包
查看>>
进化计算简介和遗传算法的实现--AForge.NET框架的使用(六)
查看>>