问题描述:
1. 问题涉及知识点.
- byte数据统计.
- 逻辑运算符.
2. 自己解法.
- 先将原始数据转换成01的形式.(每次取和他最靠近的2的次方值,然后对标志位赋1)
- 通过转换之后的编制为数组中含有1的个数.
package com.chaoxiong.niuke.huawei;
import com.chaoxiong.utils.Utils;
import java.util.Scanner;
/**
* Create by tianchaoxiong on 18-4-10.
*/
public class HuaWei_15 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int key = scanner.nextInt();
System.out.println(geResult(key));
}
private static int geResult(int key) {
// keyArr 用来存每个位置代表的值
int[] keyArr = new int[32];
// indexArr 为标志位.存转换好的0 1形式.
int[] indexArr = new int[32];
//对标志位数组和keyArr赋值.
for (int i = 0; i < 32; i++) {
keyArr[i] = (int) Math.pow(2, 32-1-i);
}
System.out.println("处理的数据是: "+key);
// Utils.printIntArr1(keyArr,keyArr.length);
// Utils.printIntArr1(indexArr,indexArr.length);
while (key > 0) {
int lateMaxKey = getLateMaxKey(keyArr, indexArr, key);
key = key - lateMaxKey;
}
// Utils.printIntArr1(indexArr,indexArr.length);
// 统计出现1的个数.
return getNum(indexArr);
}
private static int getNum(int[] indexArr) {
int num = 0;
for (int each : indexArr) {
if (each == 1)
num++;
}
return num;
}
private static int getLateMaxKey(int[] keyArr, int[] indexArr, int key) {
for (int i = 0; i < keyArr.length; i++) {
if(key>=keyArr[i]){
indexArr[i] = 1;
return keyArr[i];
}
}
return 0;
}
}
3. 优质答案.
n=n&(n-1)
算法.
package com.chaoxiong.niuke.huawei;
import java.util.Scanner;
/**
* Create by tianchaoxiong on 18-4-10.
*/
public class HuaWei_15_2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int key = scanner.nextInt();
System.out.println(count1(key));
}
private static int count1(int n) {
int count=0;
while(n!=0){//整数不为0,必有1
++count;
n=n&(n-1);
}
return count;
}
}
4. 本题总结.
整数转为二进制序列的方法:
1:采用标志位,每次找到比他小的最大次方数,迭代相见.
2:不保存,只统计.采用n=n&(n-1)
算法.