题解 | #整数中1出现的次数(从1到n整数中1出现的次数)#

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

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

感谢b站大佬蛋包饭的解析
指路:https://www.bilibili.com/video/BV1v5411J77K?from=search&seid=17761552908248216018
建议大伙看看,讲的挺不错的

具体思想为:
设分析的数据n=6501234

假设我们现在分析百位数字也就是2
定义base=100
a = n / base / 10
b = n % base
cur = n / base % 10;
数可分成三个部分(分别设为a,cur,b):
6501——2——34
a ——cur———b
此时百位出现1的次数为:
(6501+1)* 100(这里的+1加的是a为0000的情况)
即当所分析位数为1时,出现次数为 (a+1) * base

假设我们现在分析千位数字也就是1
定义base=1000
a = n / base / 10
b = n % base
cur = n / base % 10;
数可分成三个部分(分别设为a,cur,b):
650——1——234
a ——cur———b
此时千位出现1的次数为两部分:
第一部分为650 * 1000,第二部分则只包含234+1(这里的+1加的是当b为000时的情况)
即当所分析位数为1时,出现次数为 a*base+b+1

假设我们现在分析万位数字也就是0
定义base=10000
a = n / base / 10
b = n % base
cur = n / base % 10;
数可分成三个部分(分别设为a,cur,b):
65——0——1234
a ——cur———b
此时万位出现1的次数为:
65 * 10000
即当所分析位数小于1时,出现次数为 a * base
附上源代码:

public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        int base = 1;
        int res = 0;
        int b = 0;
        int a = 0;
        int cur = 0;
        while(base<=n){
            b = n % base;
            a = n/base;
            cur = a % 10;
            a = a/10;
            if(cur>1){
                res = res + (a+1)*base;
            }else if(cur == 1){
                res = res + a*base+b+1;
            }else{
                res = res + a*base;
            }
            base = base * 10;
        }
        return res;
    }
}
全部评论

相关推荐

马上要带我人生中的第一个实习生了,想问问大家都喜欢什么的mentor?好让我有个努力的目标
拒绝996的劳伦斯很勇敢:看得见目标且护犊子的 具体就是明确告诉组员要干什么,然后当别的组甩dirty work时能护的组自家新人
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务