首页 > 其他 > 详细

233. 数字 1 的个数

时间:2020-02-23 21:02:55      阅读:76      评论:0      收藏:0      [点我收藏+]

题目:

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

示例:

输入: 13
输出: 6
解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。

 

解答:

递归解决。分为首位为1和首位不为1两种情况:

1.首位为1,如12345。

先考虑大于等于10000的:则10000~12345的首位1共贡献2346个,另外0到2345贡献的后4位的1的总数递归解决:f(2345)。

再考虑小于10000的:递归解决:f(9999)

2.首位不为1,如23456。

首位的1贡献10000个(10000~19999)。然后后面4位:再分为,1:大于等于20000的:0~3456,f(3456)个。2:小于20000的:0~9999 和 10000到19999,一共2*f(9999)

代码:

 1 class Solution {
 2 public:
 3     int countDigitOne(int n) {
 4         if(n<1){return 0;}
 5         string s=to_string(n);
 6         int high=s[0]-0;
 7         int p=int(pow(10,s.size()-1));
 8         s.erase(0,1);
 9         int low=atoi(s.c_str());
10         if(high==1){
11             return (low+1)+countDigitOne(low)+countDigitOne(p-1);
12         }
13         else{//high>1
14             return p+high*countDigitOne(p-1)+countDigitOne(low);
15         }
16     }
17 };

技术分享图片

 

 

 

233. 数字 1 的个数

原文:https://www.cnblogs.com/FdWzy/p/12353967.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!