1. 程式人生 > >劍指offer——31.整數中1出現的次數

劍指offer——31.整數中1出現的次數

題目描述

求出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*

不完整導致。

  1. 如果第i位上的數字為0,則第i位可能出現1的次數由其高位決定,若沒有高位,則視為0,此時第i位可能出現1的次數為:其高位數*10^(i-1),例如若c為0,則次數為ab*10^2;
  2. 如果第i位上的數字為1,則第i位上可能出現1的次數受其高位和低位影響,若沒有,則視為0,此時第i位可能出現1的次數:其高位數*10^(i-1)+(低位數+1),例如若c為1,則次數為ab*10^2+(de+1);
  3. 如果第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;
}