前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【算法专栏】整数中1出现的次数

【算法专栏】整数中1出现的次数

作者头像
ConardLi
发布2019-05-23 21:48:05
5620
发布2019-05-23 21:48:05
举报
文章被收录于专栏:code秘密花园

题目

求出 1~13的整数中1出现的次数,并算出 100~1300的整数中1出现的次数?为此他特别数了一下 1~13中包含1的数字有 1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。

思路

以数字8103为例,分别分析每个位置为1的情况(target)

将数字拆分成 pre-target 考虑

  • 个位 3: target为1 可能有 0-1 1-1 ... 810-1 共811种情况
  • 十位 0: target为10-19 可能有 0-(10-19) 1-(10-19) ... 80-(10-19) 共81*10=810种情况
  • 百位 1: target为100-199 可能有 0-(100-199) 1-(100-199) ... 7-(100-199) + 8-(100-103) = 8*100+4 = 804种情况
  • 千为 8: target为1000-1999 可能有 0-(1000-1999) = 1000种情况

由以上示例:分三种情况考虑,现有数字abcde,分析百位数字c

  • c = 0 : 有 ab*100 种情况
  • c = 1 : 有 ab*100 + de + 1 种情况
  • c > 2 : 有 (ab+1) * 100 种情况

c是abcde第3位数:

当前的量级:level = 10的(3-1)次方

  • ab = abcde / (level*10)
  • c = (abcde / (level)) % 10
  • de = abcde % level

代码

代码语言:javascript
复制
    function NumberOf1Between1AndN_Solution(n) {      let count = 0;      let i = 1;      let high = low = current = level = 0;      let length = n.toString().length;      while (i <= length) {        level = Math.pow(10, i - 1); //第i位数位于什么量级 1 10 100 ...        high = parseInt(n / (level * 10));        low = n % Math.pow(10, i - 1);        current = parseInt(n / level) % 10;        if (current === 0) {          count += (high * level);        } else if (current === 1) {          count += (high * level + low + 1);        } else {          count += ((high + 1) * level);        }        i++;      }      return count;    }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 code秘密花园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 思路
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档