方法1:
思路:从1遍历到n,将数字转化为字符串,并通过字符串的split方法将其各个数位上的数拆分出来,形成数组,如123变为[1,2,3],通过forEach方法遍历数组,如果item为1,则次数加1;
代码:
function NumberOf1Between1AndN_Solution(n){
let res = 0;
for (let i = 0; i <= n; i++) {
i.toString().split('').forEach((item)=>{
if (item == 1) res++;
})
};
return res;
}
方法2:
思路:个位、十位、百位、千位…均由0~9组成,只能出现一个1;因此可以分别计算个位上,十位上,百位上的1出现多少次。
个位上1出现的次数:n/10,如果余数<1,则为1出现的次数为除数,如果余数>=1,则次数为除数+1;
十位上1出现的次数:n/100,如果余数小于1,则次数为除数10,如果余数>1,则次数为(除数+1)10,如果余数等于1,则次数为除数10+n/10的结果+1
百位上出现的次数:n/1000,如果余数小于1,则次数为除数100,如果余数>1,则次数为(除数+1)100,如果余数等于1,则次数为除数10+n/100的结果+1
…
举个例子:
1~1013之间,1013/10=101…3,余数3大于1,则个位上有102个1;
101/10=10…1,余数1=1,十位上有1010 + 4;
10/10=1…0,余数0<1,百位上有1100个1;
1/10=0…1,余数1=1,千位上1有0*1000 + 13个
代码:
function NumberOf1Between1AndN_Solution(n)
{
let res = 0;
let index = 0
let ne = n;
while(ne!==0){
let y = ne%10;
ne = Math.floor(ne/10);
if(y>1){
res += Math.pow(10, index) * (ne+1);
}else if(y<1){
res += Math.pow(10, index) * ne;
}else{
let temp = Math.pow(10, index);
res += temp * ne + n % temp + 1;
}
index++;
}
return res;
}