算法 剑指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 代码如下:
常规思路:遍历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)));// } }