算法题—查找—求1~n之间数字1出现的次数—javascript实现

方法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,百位上有1
100个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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值