剑指offer
Posted jiajun107
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer相关的知识,希望对你有一定的参考价值。
八、位运算
1. 二进制中1的个数
题目描述:
? 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:
常规解法:
? 首先把n和1做与运算,判断n的最低位是不是1。接着把n左移一位,再和n做与运算,判断次低位是不是1……这样反复左移,就能从右至左依次判断n的每一位是不是1。
优解:
? 若对于一个int类型的整数,它由32位2进制来表示,则上面的常规解法需要循环32次。下面再介绍一种算法,整数中有几个1就只需要循环几次。
? 把一个整数减去1的结果与原整数做与运算,这样会把该整数最右边的1变成0。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
代码:
常规解法:
public class Solution {
public int NumberOf1(int n) {
int count = 0;
int flag = 1;
while (flag != 0) {
if ((n & flag) != 0) {
count++;
}
flag = flag << 1;
}
return count;
}
}
优解:
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while (n != 0) {
count++;
n = (n - 1) & n;
}
return count;
}
}
以上是关于剑指offer的主要内容,如果未能解决你的问题,请参考以下文章
剑指 Offer(第 2 版)完整题解笔记 & C++代码实现(LeetCode版)
LeetCode(剑指 Offer)- 14- I. 剪绳子
LeetCode(剑指 Offer)- 14- I. 剪绳子
剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子 剑指 Offer 40. 最小的k个数