[LeetCode][233]数字 1 的个数

news/2024/11/14 23:59:57/

题目

233. 数字 1 的个数

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

  • 示例 1:

输入:n = 13
输出:6

  • 示例 2:

输入:n = 0
输出:0

  • 提示:
    0 <= n <= 10^9

解法1:

  1. 这种题其实就是找规律,类似于数学归纳法,找出一个计算通式可以在给出任意值时计算到目标结果
  2. 这道题我选择从高位往低位统计
  3. 首先找规律,得出不同位数1出现的次数:0位0次,1位(0-9)1次,2位(0-99)20次…
  4. 然后从高位开始,例如123从高位开始,依次处理 100、20、3。
  5. 100包含了0-99,有20个1,20包含了12个1,3包含了1个1
  6. 而123后面的23又为百位上的1多加了24个1,即100-123百位上共24个1,这个也要统计

class Solution {
public:int countDigitOne(int n) {if(!n) return 0;vector<int> count(10, 0);for(int i=1; i<=9; ++i){//统计不同位数的1出现的次数,0位0次,1位(0-9)1次,2位(0-99)20次...count[i]=i*pow(10, i-1);}// for(auto &ele:count) cout << ele << endl;int numDigits = (int)log10(n) + 1; // 获取数字的位数cout << numDigits << endl;int ans=0;for (int i = numDigits-1; i >= 0; i--) {//从高位开始统计int powerOf10 = (int)pow(10, i);int digit = n / powerOf10; // 获取当前位的数字if(digit==0) continue; //处理类似102这种情况中间的0ans+=digit*count[i];n %= powerOf10; // 移除当前位//如123,23让1多出现了24次(100-123),而423是百位上的1固定出现了100次(101-199)digit<=1 ? ans=ans+n+1 : ans+=powerOf10; }return ans;}
};

解法2:

  1. 另一种解法是统计当前位上,1出现了多少次
  2. 当当前位上为0时,其出现1的次数由高位确定,如1203,十位上1出现的次数由十位以上确定,此处出现了12*10=120次
  3. 当当前位上为1时,其出现1的次数为高位+低位共同确定,如1213,出现了12*10+3+1=124次
  4. 当当前位上位2-9时,其出现1的次数也只由高位确定,如1243,十位上1出现次数为 (12+1)*10=130次

class Solution {
public:int countDigitOne(int n) {long currentDigit = 1; // 当前位的权值,最低位开始int high = n / 10, cur = n % 10, low = 0, count = 0; // 初始化高位、当前位、低位、结果个数while (high != 0 || cur != 0) {if (cur == 0) {// 当前位为0时,结果由高位决定count += high * currentDigit;} else if (cur == 1) {// 当前位为1时,结果由高位和低位共同决定count += high * currentDigit + low + 1;} else {// 当前位大于1时,结果由高位决定count += (high + 1) * currentDigit;}// 更新低位并跳到下一位low += cur * currentDigit;cur = high % 10;high /= 10;currentDigit *= 10; // 更新位数权值}return count;}
};

http://www.ppmy.cn/news/1400344.html

相关文章

原型链-(前端面试 2024 版)

来讲一讲原型链 原型链只存在于函数之中 四个规则 1、引用类型&#xff0c;都具有对象特性&#xff0c;即可自由扩展属性。 2、引用类型&#xff0c;都有一个隐式原型 __proto__ 属性&#xff0c;属性值是一个普通的对象。 3、引用类型&#xff0c;隐式原型 __proto__ 的属…

iOS - Runtime-isa详解(位域、union(共用体)、位运算)

文章目录 iOS - Runtime-isa详解&#xff08;位域、union&#xff08;共用体&#xff09;、位运算&#xff09;前言1. 位域介绍1.1 思路1.2 示例 - 结构体1.3 示例 - union&#xff08;共用体&#xff09;1.3.1 说明 1.4 结构体 对比 union&#xff08;共用体&#xff09; 2. a…

SQL Server 实验二:数据库视图的创建和使用

目录 第一关 相关知识 什么是表 操作数据表 创建数据表 插入数据 修改表结构 删除数据表 编程要求 第一关实验代码&#xff1a; 第二关 相关知识 视图是什么 视图的优缺点 视图的优点 视图的缺点 操作视图 创建视图 通过视图向基本表中插入数据 通过视图修改基本表的…

设计模式——结构型——外观模式Facade

处理器类 public class Cpu {public void start() {System.out.println("处理器启动了...");} } 内存类 public class Memory {public void start() {System.out.println("内存启动了...");} } 硬盘类 public class Disk {public void start() {Syste…

【Boost搜索引擎项目】项目思维导图+项目总结

Boost搜索引擎 1.项目思维导图2.项目总结3.项目地址 1.项目思维导图 2.项目总结 该项目是基于Boost库实现一个搜索引擎功能&#xff0c;部署在Linux服务器上。支持多用户同时并发的访问服务器。用户可以通过浏览器访问服务器IP地址端口号使用搜索引擎&#xff0c;通过搜索关键…

爬取b站音频和视频数据,未合成一个视频

一、首先找到含有音频和视频的url地址 打开一个视频&#xff0c;刷新后&#xff0c;找到这个包&#xff0c;里面有我们所需要的数据 访问这个数据包后&#xff0c;获取字符串数据&#xff0c;用正则提取&#xff0c;再转为json字符串方便提取。 二、获得标题和音频数据后&…

MySQL实现读写分离

1. mycat实现读写分离 MyCAT 是使用 JAVA 语言进行编写开发&#xff0c;使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性&#xff0c;所以要求必须在 JDK7 以上的版本上运行。 官网下载jdk并解压文件 [rootmycat ~]# tar -xf jdk-8u181-linux-x…

【探索Linux】—— 强大的命令行工具 P.31(守护进程)

阅读导航 引言一、守护进程简介1. 概念2. 特点 二、用C创建守护进程⭕代码✅主要步骤 温馨提示 引言 当谈到计算机系统中运行的特殊进程时&#xff0c;守护进程&#xff08;daemon&#xff09;无疑是一个备受关注的话题。作为在后台默默运行并提供各种服务的进程&#xff0c;守…