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

解释:比如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)));// 
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值