233. 数字 1 的个数
2021/7/14 23:16:41
本文主要是介绍233. 数字 1 的个数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录- 题目
- tips
- 解法1
- 解法2
题目
给定一个整数n
,计算所有小于等于n
的非负整数中数字1
出现的个数。
示例:
输入: 13
输出: 6
解释: 数字1
出现在以下数字中: 1, 10, 11, 12, 13
。
提示1:
Beware of overflow
.
tips
注意这是一类观察规律的编程题,解题的技巧体现在对规律的观察上
解法1
暴力法,超时
class Solution { public: int countDigitOne(int n) { if(n < 1) return 0; int ret = 0; for(int i = 1;i <= n;i++) { int number = i; while(number) { if(number%10 == 1) ret++; number/=10; } } return ret; } };
解法2
通过观察,找到规律,直接计算出来的递归解法,从最高位,从小到大,进行计数,等完全排除最高位的影响后,再从次一位递归进行计数
class Solution { public: int countDigitOne(int n) { if(n < 1) return 0; if(n<10) return 1; //数字的位数 int len = 0; int number = n; while(number) { len++; number/=10; } int ret = 0; //最高位的权重 int temp = pow(10,len-1); //取出最高位的值 int first = n/temp; if(first == 1) { //最高位取0,这时的计数值由其他的位贡献 ret+=(len-1)*(temp/10);//高中的排列组合问题 //最高位可以贡献的计数值 ret+= (n%temp)+1; } else { //最高位取0~first-1时,由其他位贡献的计数值 ret+=first*(len-1)*(temp/10); //最高位可以贡献的计数值(此时最高位取值1) ret+= temp; } ret+= countDigitOne(n%temp); return ret; } };
这篇关于233. 数字 1 的个数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11有哪些好用的家政团队管理工具?
- 2025-01-11营销人必看的GTM五个指标
- 2025-01-11办公软件在直播电商前期筹划中的应用与推荐
- 2025-01-11提升组织效率:上级管理者如何优化跨部门任务分配
- 2025-01-11酒店精细化运营背后的协同工具支持
- 2025-01-11跨境电商选品全攻略:工具使用、市场数据与选品策略
- 2025-01-11数据驱动酒店管理:在线工具的核心价值解析
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide
- 2025-01-11不得不了解的高效AI办公工具API