[牛客网]求int型正整数在内存中存储时1的个数

https://www.nowcoder.com/practice/440f16e490a0404786865e99c6ad91c9?tpId=37&tqId=21238&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3Fdifficulty%3D2%26page%3D1%26pageSize%3D50%26search%3D%26tpId%3D37%26type%3D37&difficulty=2&judgeStatus=undefined&tags=&title=

1、题目

[牛客网]求int型正整数在内存中存储时1的个数_第1张图片

2、思路

  1. 先得到2^0-2^31次方的数值,用arr[i] (i>=0;i<=31)存起来

  1. 假设输入的值为num,则从大遍历arr[i],num-arr[i]>0这个arr[i]就是我们要的,此时i的位置就是1,即1*2^i=arr[i]

  1. 因为求的是1的个数,所以只要求有多少个1就行了

3、代码

import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str=sc.nextLine();
        int num=Integer.parseInt(str);
        int[] arr=new int[32];
        for(int i=0;i<=31;i++){arr[i]=(int)Math.pow(2,i);}
        int flag=0;
        //找到最近的一个大于num的数,从这个数开始遍历会提高效率.
        for(int i=31;i>=0;i--){
            if(arr[i]0){
            for(int i=flag;i>=0 ;i--){
                if(num-arr[i]>=0) {num=num-arr[i];res++;break;}
            }
        }
        System.out.println(res);
    }
}

你可能感兴趣的:(leecode每日一题,算法,java)