剑指offer第32题JS算法:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次

本文介绍了面试中遇到的一道JS算法题,即计算从1到n所有整数中数字1出现的总次数。以12为例,1共出现了5次。虽然最初使用了简单的for循环解决,但后来发现题目蕴含的趣味性和挑战性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次

这是我某一次去朋友公司面试试水时出的面试题,结果给我五分钟我写了个for循环的方法,被狠狠鄙视/哭笑不得

结果回来后好奇就跟同事一起看了看这道题发现也挺有意思的

//参数n为中点数字,且为整数
function result(n){
    //count表示观察的值(这里为1)出现的次数,base表示当前循环权重,round表示当前要进入循环的数和当前数的周期(高位)
    let count = 0,base = 1,round = n
    //当前要进入循环的数不小于1时,执行循环
    while(round>=1){
//求出当前数基数
        let weight = round % 10
//求出当前数周期(向下取整),并用作下一轮循环的数
        round = Math.floor(round / 10)
//当基数小于1(即为0)时,出现次数为当前周期乘以当前权重
if(weight < 1){
            count += round * base
//当基数大于1时,出现次数为当前周期乘以当前权重再加上额外的一次权重
}else if(weight > 1){
            count += (round + 1) * base
//当基数等于1时,出现次数为当前周期乘以当前权重再加上(基数低一位的数值加1,加1是因为从0开始计数)
        } else if(weight === 1){
            count += round * base + (n%base)+1
        }
//本次循环完毕后权重乘以10,实现按位数循环,达到O(logn)的复杂度
        base *= 10
    }
    //返回最终的出现总次数
    return count
}
改良版:
function result(n,m){
    let count = 0,base = 1,round = n
    while(round>=m){
        let weight = round % 10
        round = Math.floor(round / 10)
        if(weight > m){
            count += (round + 1) * base
        } else if(weight === m){
            count += round * base + (n%base)+1
        } else{
            count += round * base
        }
        base *= 10
    }
    return count
}
n为最大整数,m为要观察次数的数字

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值