当前位置: 首页 > news >正文

数字 1 出现的个数

给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。

示例 1:

输入:n = 13
输出:6

示例 2:

输入:n = 0
输出:0

提示:

  • 0 <= n <= 109
class Solution {
public:int countDigitOne(int n) {int count = 0;long long factor = 1;  // 用于表示 10^x,从个位开始逐位分析while (n / factor > 0) {long long lower = n % factor;  // 低位long long current = (n / factor) % 10;  // 当前位long long higher = n / (factor * 10);  // 高位if (current == 0) {count += higher * factor;} else if (current == 1) {count += higher * factor + lower + 1;} else {count += (higher + 1) * factor;}factor *= 10;}return count;
}};

 找规律:

  •  current == 0:当前位为 0 时,1 出现的次数为 higher * factor。factor表示一个 10 的幂次。举例:对于10的个位数上可能出现的只有1一种,对于100的十位数上可能出现的有10到19共10种

  •  current > 1:当前位大于 1 时,1 在这一位上出现的次数为 (higher + 1) * factor。例如:12的个位数有1的有1,11两种;120的十位数上有1的有10到19和110到119共20种

  •  current == 1:当前位是 1 的次数除了与高位相关,还与低位相关。当前位等于 1 时,1 出现的次数为 higher * factor + (lower + 1)。例如2143的百位数有1的情况相当于2100的情况加上所有低位上的组合( 2100, 2101, ..., 2143,从0到43共44种).


http://www.mrgr.cn/news/42861.html

相关文章:

  • [图形学]smallpt代码详解(1)
  • 现在的新电脑在任务管理器里又多了个NPU?它是啥?
  • 项目-坦克大战学习-爆炸特效消除
  • 昇思学习打卡营学习记录:CycleGAN壁画修复
  • Linux:无法为立即文档创建临时文件: 设备上没有空间
  • PHP数组
  • 嵌入式C语言自我修养:编译链接
  • Studying-多线程学习Part2 - 互斥量死锁、lock_guard 与 unique_lock、call_once与其使用场景
  • 零基础编程从哪开始学?
  • 394. 字符串解码
  • 如何使用虚拟机充当软路由
  • 10.4每日作业
  • Docker 从安装到实战
  • 链式前向星(最通俗易懂的讲解)
  • P4240 毒瘤之神的考验
  • 杀毒软件原理
  • kubeadm部署k8s
  • flutter_鸿蒙next_Dart基础③函数
  • 计算机网络——应用层
  • 【Qt】控件概述(2)—— 按钮类控件