您的位置:首页 > Web前端

剑指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-js