今天心血来潮做了下算法题Number of 1 bits这是道比较简单的题目。leetcode可以尝试一下多种语言,所以也算是个学语言的好方法。
C++实现
class Solution {
public:
int hammingWeight(uint32_t n) {
int number=0;
for(int i=0; i<32; i++)
{
if(n & 1) //C++和C里0相当于false,其他数字都true
number++;
n=n>>1;
}
return number;
}
};
讨论里得票最多的代码
int hammingWeight(uint32_t n)
{
int res = 0;
while(n)
{
n &= n - 1;
++ res;
}
return res;
}
Java实现
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int number=0;
while(n != 0)
{
if((n & 1)==1)
number++;
n=n>>>1;
}
return number;
}
}
还有一个更好的,来自讨论
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int count = 0;
for (; n != 0; n >>>= 1)
count += 1 & n;
return count;
}
}
还有人用String来匹配
public int hammingWeight(int n) {
int count = 0;
String str = Integer.toBinaryString(n);
for(int i=0; i<str.length(); i++) {
if(str.charAt(i)=='1') {
count++;
}
}
return count;
}
Java的位运算有一点特殊的是他的>>>, 和C++里的>>效果相同, 称为无符号位移,而<<和>>则表示也位移,区别在>>上,java里会保持结果的符号,也就是说如果是负数,将由1来补位。
Python
同样来自讨论
class Solution:
# @param n, an integer
# @return an integer
def hammingWeight(self, n):
return bin(n).count('1')
被python简洁震惊了
另外,位计算和java相同。
Javascript
var hammingWeight = function(n) {
var numOfZero = 0;
while(n){
numOfZero += n%2;
n>>=1;
}
return numOfZero;
};
余数相加也是个好办法