劍指offer——31.整數中1出現的次數
阿新 • • 發佈:2019-02-15
題目描述
求出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;
}