java-----------华为机试----------求int型正整数在内存中存储时1的个数 (水题for java)

题目描述

输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。

输入描述:

 输入一个整数(int类型)

输出描述:

 这个数转换成2进制后,输出1的个数

输入例子:

5

输出例子:

2

 很简单啊,直接调用函数Interger.toBinaryString转为数字对应的二进制字符串;
解法:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int num = sc.nextInt();
            String str = Integer.toBinaryString(num);
            // 调用默认函数,讲十进制转二进制
            int len = str.length();// 判断循环次数
            int count = 0; // int 一个count作为计数器
            for (int i = 0; i < len; i++) {
                if (str.charAt(i) == '1') {
                    // 每遇到一个‘1’,计数器
                    count++;
                }

            }
            System.out.println(count);
        }
    }
}

 

String str=Integer.toBinaryString(num);//10进制转2进制
Integer.toHexString(num);//10进制转16进制
Integer.toOctalString(num);//10进制转2进制;

当然这不算通解,通解在这:

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while (sc.hasNext()) {
            int num = sc.nextInt();
            String s = Integer.toString(num, 2);
            // Interger.toString(N,B),N为10进制数字,B为字符串内的进制

            int len = s.length();// 判断循环次数
            int count = 0; // int 一个count作为计数器
            for (int i = 0; i < len; i++) {
                if (s.charAt(i) == '1') { // 每遇到一个‘1’,计数器count+=1;
                    count++;
                }
            }
            System.out.println(count);
        }
    }
}

顺带说下,任意进制转10进制,java也是有自带方法的。

int i = Integer.parseInt("32", N);
Integer i = Integer.valueOf("32", N);

这题,我参考了http://blog.csdn.net/lzuacm/article/details/52691106的思想后,他说n&(n-1)的次数就是1的个数;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while (sc.hasNext()) {
            int num = sc.nextInt();
            System.out.println(digitofNum(num));
        }
    }

    public static int digitofNum(int n) {
        int count = 0;
        while (n != 0) {
            n = n & (n - 1);
            count++;
        }
        return count;
    }
}

虽然我不明白原理,但是还是先记住吧!不过时间,空间和第一种一样,都比第二种通用的要少,不过也没少太多10个测试,就少2ms。

posted @ 2017-04-28 12:12  过道  阅读(290)  评论(0)    收藏  举报