您的位置:首页 > 职场人生

算法 剑指Offer 面试题32 从1到n整数中1出现的次数

2016-06-04 10:20 375 查看
解释:比如1~12, 1 出现了5次

常规思路:遍历1~n,每个数的每一位通过曲余判断是否等于1,这样时间复杂度是O(nlogn),而且是这么多次取余运算,计算量很大

思路:参考代码中注释,一位一位计算1的个数,每一位判断大于1,等于1,等于0,做相应不同的计算

时间复杂度:O(logn),n 是数字,logn 是数字的位数

java 代码如下:

package algorithm;

/**
* @Usage 给出数字n,求1 到n,中数字1 出现的次数
* @author jaloli
*
*/
public class Count1Number {

//个十百千万位的顺序,一位一位计算1的个数
public static int GetBit1Number(int number, int bitNum, int square) { //bitNum 位上的数字,square 哪一位,标志着平方数

int bitCount = 0;
if(bitNum > 1) {
/*
* Sample:
* 	数字是 abcde , 当前位是百位,c>1,(ab+1)*100, 也就是高位有位权即乘以100,低位是多少直接就加多少,比如de或100
*
*/
bitCount = (int) ((number / (int)Math.pow(10, square) * (int)Math.pow(10, square -1)) + (int)Math.pow(10, square -1));
} else if(bitNum == 1) {
/*
* Sample:
* 	数字是 abcde , 当前位是百位,c=1,ab*100 +(de+1)
*
*/
bitCount = (int) ((number / (int)Math.pow(10, square) * (int)Math.pow(10, square -1)) + (number % (int)Math.pow(10, square -1) + 1));
} else if(bitNum == 0) {
/*
* Sample:
* 	数字是 abcde , 当前位是百位,c<1,ab*100
*
*/
bitCount = (int) (number / (int)Math.pow(10, square) * (int)Math.pow(10, square -1));
}
System.out.println(String.format("第%d位1的个数是%d", square,bitCount));
return bitCount;
}

public static int Get1Number(int number) {
int realNumber = number;
int count = 1;
int bitNum;
int wholeCount = 0;
while((bitNum = number % 10)!=0) {
wholeCount = wholeCount + GetBit1Number(realNumber, bitNum, count);
number = number / 10;
count++;
}
return wholeCount;
}

public static void main(String[] args) {
int n = 12113;//22345
System.out.println(String.format("1~%d 中1 的总个数是%d", n, Get1Number(n)));//
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: