LeetCode答题记录233. 数字1的个数

给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
输入: 13
输出: 6
解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。

func countDigitOne(_ n: Int) -> Int {
    var inN = n
    var k = 1;
    while inN >= 10 {
        inN = inN / 10
        k *= 10;
    }
    return self.calculate(n, k)
}
func calculate(_ n: Int, _ k: Int) -> Int {
    //保证k与n位数相同 k = "1","10","100"...
    if n < 1 {
        return 0
    }
    if n < 10 {
        return 1
    }
    var inK = k;
    while n / inK < 1 {
        inK /= 10
    }
    var c = 0;
    c = n / inK;
    if c == 1 {
        return (n - inK + 1) + self.calculate(n-inK, inK/10) + self.calculate(inK-1,inK/10)
    }else {
        return inK + calculate(n-c*inK,inK/10) + c * self.calculate(inK-1,inK/10)
    }
}

解法:递归求解。
1、计算最高位出现数字1的次数;if:最高位大于1 次数为 10的k次方,k是最高位的位数,等于1:次数为 n-k+1。
2、计算次高位:去掉最高位,计算剩余部分出现数字1的次数。计算方式见下详解
3、当入参位数为1位即 n < 10 时返回1。
这个过程递归,即可求出最终结果

第二步详解:例子n = 2345. 相当于计算0999的百位出现1的次数+10001999百位出现1的次数+2000~2345百位出现1的次数
也就是0~999百位为1的次数 * 2 + 0~345百位为1的次数

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 4,067评论 0 2
  • 这个不错分享给大家,从扣上看到的,就转过来了 《电脑专业英语》 file [fail] n. 文件;v. 保存文...
    麦子先生R阅读 7,118评论 5 24
  • 今天正式开启了期末考试模式,虽然只是选修课程,但确实是开始了。 今天考了两科《企业文化》《财务管理》,一科与我们专...
    何C呀阅读 172评论 1 0
  • 本想把几本书的读书笔记的写完,但只写了一本。是因为很认真的在写还有一些其他的事情开小差。总之要加班写完。一直不愿意...
    TA77高振华阅读 161评论 0 1
  • 原文链接:http://androidweekly.net/issues/issue-196 点击订阅邮箱第一时间...
    AndroidWeekly阅读 429评论 0 3

友情链接更多精彩内容