最近想刷一下LeetCode练习一下数据结构算法之类的,先从水题开始吧
题目是这样的
Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming weight).
For example, the 32-bit integer ’11' has binary representation 00000000000000000000000000001011
, so the function should return 3.
大概就是32位整形数计算其中1的个数也就是汉明码重,因为最近正在复习C方面的基础知识,看了一本 C和指针 在操作符那一章里面有关于位运算的讲解,其中就是拿这个题目来讲解的,经典果然是经典啊!由此也可以看出,一些大公司的笔试面试题也喜欢从这些经典的书籍里面找原题或者思路
下面就给出Solution:
1 class Solution { 2 public: 3 int hammingWeight(uint32_t n) { 4 int ones=0; 5 for(;n!=0;n>>=1){ 6 if((n&1)!=0){ 7 ones++; 8 } 9 } 10 return ones; 11 } 12 };
简单来说是一个循环,循环判断当前的数字中是否还有1
值得说明的是(1)n&1 判断最低位 如果是0 n>>=1 如果是1 ones加一表示1的位数加一
(2)n>>=1 这是一个右移操作,我们来回顾一下移位操作
首先是 左移操作
左移操作向左移出n位后尾部空缺位用0补足
其次是 右移操作
右移操作又分为逻辑右移和算术右移两者是有区别的:逻辑右移与左移操作类似,只是向右移出n位后左边的空缺位由0补足;算术右移的话右移n位后高位的空缺位需要用符号位补足,如果是负数就补足1如果是正数就补足0
而到底是什么右移方式是由你的编译器来决定的
当然这道题还有一点小变动:
1 class Solution { 2 public: 3 int hammingWeight(uint32_t n) { 4 int ones=0; 5 for(;n!=0;n>>=1){ 6 if((n%2)!=0){ 7 ones++; 8 } 9 } 10 return ones; 11 } 12 };
只是将条件判断改成了(n%2)!=0 效果是相同的都是判断当前为是否为1
顺便吐槽下,java运行有这么慢?我不信