【LeetCode & 剑指offer刷题】特殊数题1:43 1~n整数中1出现的次数 (233. Number of Digit One )...

【LeetCode & 剑指offer刷题】特殊数题1:43 1~n整数中1出现的次数 (233. Number of Digit One )

【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)

233. Number of Digit One

Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n.
Example:
Input: 13
Output: 6
Explanation: Digit 1 occurred in the following numbers: 1, 10, 11, 12, 13.
思路:
 
 

 

/*
比如 1 在十位数时
->100 10
->200 20
...
->1600 160 (最后两位小于 10 时)
->161x 160 + x + 1 10 最后两位 < 20
->1650 160 + 10 (≥ 20
*/
class Solution
{
public :
    int countDigitOne ( int n )
    {
        int counter = 0 ;
        for ( long i = 1 ; i <= n ; i *= 10 ) //i为1所在位数比如上例中的10,divider为除数,比如上例中的100,remainder为n除以divider的余数,比如上例中的后两位数
        {
            long divider = i * 10 ; // 防止 n 过大导致 i*10 溢出
            int remainder = n % divider ;
            if ( remainder >= 2 * i ) counter += ( n / divider ) * i + i ;
            else if ( remainder >= i && remainder < 2 * i ) counter += ( n / divider ) * i + ( n % divider ) - i + 1 ;
            else counter += ( n / divider )* i ;
        }
       
        return counter ;
    }
};
 
 

 

posted @ 2019-01-05 16:28 wikiwen 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值