双指针,快慢指针6行代码

整数中1出现的次数(从1到n整数中1出现的次数)

http://www.nowcoder.com/questionTerminal/bd7f978302044eee894445e244c7eee6

双指针6行代码,对于每一个数求1的个数,然后加起来。对于每一个数来说求个位只需要mod10就好,然后将原数/10 替换 原数,再mod10求得十位,以此类推,可得各十百千。。。位。 然后循环--即可

public int NumberOf1Between1AndN_Solution(int n) {
    int count=0;
    for(int i=n;i>0;i--){
        for(int j=i;j>0;j/=10){
            if(j%10==1) count++;
        }
    }return count;
全部评论
你不适合这个行业
4 回复 分享
发布于 2020-06-28 16:44
这是哪门子双指针
4 回复 分享
发布于 2020-03-12 21:30
楼主加油!链接:https://www.nowcoder.com/questionTerminal/bd7f978302044eee894445e244c7eee6?answerType=1&f=discussion 来源:牛客网 方法一:递归方法(参考力扣答案) 思路: f(n)为1-n范围内,这n个数中1出现的次数 首先将n分为两种情况:情况一:最高位为1(如1234);情况二:最高位不为1(如3234) 情况一:当最高位为1时(以1234为例): ①:将n分为两部分,最高位单独拿出来为1,定义为high;剩下的部分为234,定义为last; ②:获取到最高位的分位,为千分位,即定义pow=1000; ③将数据n定义两个范围: 1.1-999范围内,1的个数为f(pow-1); 2.1000-1234范围内: 1)首先只考虑千分位是1的个数:也就是1000、1001、1002...1234,即234+1,转换下为:last+1 2)其次考虑其他位数上的1的个数为:f(last)。 综上所述:情况一中1出现的次数为:f(pow-1)+last+1+f(last) 情况二:当最高为不为1时(以3234为例): ①:1-999范围内,1的个数依然为:f(pow-1); ②:1000-1999范围内: 1)只考虑千分位是1的个数为:1000、1001、1002...1999即1000个也就是pow; 2)其他位数上1的数量为:f(pow-1) ③:2000-2999范围内1的个数:f(pow-1),注意这里的千分位是2,所以不要考虑分两种情况 ④:3000-3234范围内1的个数:f(last)
1 回复 分享
发布于 2020-07-19 17:32
直接遍历,面试就gg了
点赞 回复 分享
发布于 2020-05-05 00:46
用j/10替换原数太棒了
点赞 回复 分享
发布于 2020-04-11 09:55

相关推荐

玉无心❤️:发照片干啥 发简历啊
点赞 评论 收藏
分享
评论
44
2
分享

创作者周榜

更多
牛客网
牛客企业服务