剑指offer——31.整数中1出现的次数
2017-09-04 19:20
459 查看
题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数代码
思路1:如:30143:由于3>1,则个位上出现1的次数为(3014+1)*1
由于4>1,则十位上出现1的次数为(301+1)*10
由于1=1,则百位上出现1次数为(30+0)*100+(43+1)
由于0<1,则千位上出现1次数为(3+0)*1000
注:以百位为例,百位出现1为100~199,100的意思为单步出现了100~199,100次,*30是因为出现了30次100~199,+(43+1)是因为左后一次301*不完整导致。
如果第i位上的数字为0,则第i位可能出现1的次数由其高位决定,若没有高位,则视为0,此时第i位可能出现1的次数为:其高位数*10^(i-1),例如若c为0,则次数为ab*10^2;
如果第i位上的数字为1,则第i位上可能出现1的次数受其高位和低位影响,若没有,则视为0,此时第i位可能出现1的次数:其高位数*10^(i-1)+(低位数+1),例如若c为1,则次数为ab*10^2+(de+1);
如果第i位上的数字大于1,则第i位上可能出现1的次数受其高位影响,若没有,则视为0,此时第i位可能出现1的次数:(其高位数+1)*10^(i-1),例如若c大于1,则次数为(ab+1)*10^2;
function NumberOf1Between1AndN_Solution(n) { // write code here if(n<0) return 0; var high=n,cur,low,tmp,count=0,i=1; while(high!=0){ high=parseInt(n/Math.pow(10,i));//获取高位数 tmp=n%Math.pow(10,i);//获取余下数 cur = parseInt(tmp/Math.pow(10,i-1));//获取第i位 low=tmp%Math.pow(10,i-1);//低位数 if(cur==1){//为1 count+=high*Math.pow(10,i-1)+low+1; }else if(cur==0){//为0 count+=high*Math.pow(10,i-1); }else{ count+=(high+1)*Math.pow(10,i-1) } i++ } return count; }
思路2:暴力解决
function NumberOf1Between1AndN_Solution(n) { // write code here if(n<0){ return 0; } var count=0; for(var i = 1;i<=n;i++){ var number = i; while(number>0){ if(number%10==1){ count++; } number = Math.floor(number/10); } } return count; }
相关文章推荐
- 剑指offer(31)—整数1出现的次数
- 《剑指offer》-整数中1出现的次数
- 剑指offer——面试题32:从1到n整数中1出现的次数
- 剑指Offer——(31)整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer:(32)时间效率 :整数中1出现的次数(从1到n整数中1出现的次数)
- 从1到n整数中1出现的次数——剑指offer面试题32
- 《剑指offer》:[32]从1到n整数中1出现的次数
- 剑指offer——整数中1出现的次数
- 《剑指Offer》学习笔记--面试题32:从1到n整数中1出现的次数
- 剑指Offer(java版):从1到n整数中1出现的次数
- 剑指offer——面试题32:从1到n整数中1出现的次数
- 关于剑指offer上“从1到n整数中1出现的次数”题的理解
- 剑指offer-整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer(16)-从1到n整数中1出现的次数
- 《剑指offer》——整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer(33):从1到n整数中1出现的次数
- 剑指offer(四十)之整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer系列之三十:整数中1出现的次数
- 剑指Offer_31_整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer-整数中1出现的次数