java之从1到n整数中1出现的次数

来源:互联网 发布:分色软件 编辑:程序博客网 时间:2024/05/22 17:40

题目:输入一个整数n,求从1到n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1、10、11和12、1一共出现5次。

解法1:

package BitCount;import java.util.Scanner;public class CountOneMain {public static int countOne(int n) {int num = 0;for (int i = 1; i <= n; i++)num += NumberOf1(i);return num;}public static int NumberOf1(int n) {int num = 0;while (n != 0) {if (n % 10 == 1)num++;n = n / 10;}return num;}public static void main(String[] args) {Scanner scanner=new Scanner(System.in);int n=scanner.nextInt();System.out.println(countOne(n));}}
其时间复杂度为O(n*logn),这种情况面试官不会满意还需要提高。

解法二:

package BitCount;import java.util.Scanner;public class CountOneMain1 {   public static int num_of_bits(int n){    int k = 0; //初始为0位    for(int m = n; m > 0; m /=10)        k ++;    return k;}//得到一个数n的第i位的数字。最低位为第0位static int number_of(int n, int i){    int num = num_of_bits(n);    if(i < 0 || i > (num-1))        return 0;    return ((int)(n/Math.pow(10,num-i-1)));}//从0到n的所有整数中1数字出现的次数//实现方案1:直接利用数n每个位上的归纳算出1出现的个数public static int count_From_One_1( int n){    //位数    int num = num_of_bits(n);    //跨度    int scale = (int)Math.pow(10, num-1);    //商    int quotient = 0;    //余数    int remainder = 0;    //某一位的数的大小。    int bit = 0;//初始为0    int count = 0; //计数    for(int i = 0; i < num; i++)    {        count += quotient * scale;        bit = number_of(n,i);        if(bit > 1)            count += scale;        else if(bit == 1)        {            if(i == num-1)                remainder = 1;            else                remainder = n%scale + 1;            count += remainder;        }        quotient = (int)(n/scale);        scale /= 10;    }    return count;}public static void main(String[] args) {Scanner scanner=new Scanner(System.in);int n=scanner.nextInt();System.out.println(count_From_One_1(n));}}



0 0
原创粉丝点击