题目来源:牛客网--二进制中1的个数
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解题思路
使用java中内置的函数比较简单,会自动转换为二进制并返回一个字符串,之后只需要遍历字符串中 1 的个数就好了,或者把字符串中的0替换为空字符,对字符串求长。
java代码
import java.util.Scanner;
public class numberOfOne {
public static void main(String[] args) {
int count = 0;
Scanner in = new Scanner(System.in);
int n = in.nextInt();
// 转换为二进制,返回值为字符串
String str = Integer.toBinaryString(n);
// 把 0 替换成空值,求长度,得到 1 的个数
// System.out.println(str.replaceAll("0", "").length());
// 遍历字符串,统计 1 的个数
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == '1') {
count++;
}
}
System.out.println(count);
}
}
调用api属于耍赖?好吧,补上两种不耍赖的
这两种解法题目评论下边都有,翻了一下觉得挺好。
第一种
public static void test(int n) {
int count = 0;
while (n !=0) {
count++;
// 每次与运算都会把 n 最右边的 1 与掉,这样有多少 1 就循环多少次
// 1001 & 1000 值为 1000,最右边的 1 掉了
n = n & (n-1);
}
System.out.println(count);
}
第二种
public static void test2(int n) {
int count = 0;
while(n != 0) {
count += n & 1;
// 无符号右移,这样就不用考虑负数自动补1了,有多少位循环多少次
// 1001 >>> 1 值为 100
n = n >>> 1;
}
System.out.println(count);
}
网友评论