华为在线编程题系列-15-求int型正整数在内存中存储时1的个数

问题描述:
问题描述

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)算法.

猜你喜欢

转载自blog.csdn.net/u012222078/article/details/80215872