[LeetCode]Number of Digit One

很有意思的一道题,找到数学规律,从个位数一直找到最高位

比如输入13,那么在个位数上会有 13 / 10 乘以 1 个 1, 这个只是算了10之前的个位数上的1,同时还要加上10到13这一段个位数上的1,这里因为3大于1,所以加以,如果3是小于1的则不加那个一。

同理,推导到十位数,13/100为 0 个0, 然后我们判断从000 到 013这一段十位数上有多少个1, 因为13 是大于 10, 但是小于20的, 所以我们要加上 13 - 10 + 1个1

注意不要超限,题目既然都说了,那么最好可能超限的变量都用long好了

代码如下

public class Solution {
    public int countDigitOne(int n) {
        long tmp = 10;
        long result = 0;
        long N = n;
        while (tmp <= N * 10) {
            result += (N / tmp) * (tmp / 10);
            if (N % tmp >= 2 * tmp / 10) {
                result += tmp / 10;
            } else if (N % tmp >= tmp / 10) {
                result += n % tmp - tmp / 10 + 1;
            }
            tmp *= 10;
        }
        return (int)result;
    }
}

 

posted @ 2015-11-27 05:41  Weizheng_Love_Coding  阅读(123)  评论(0编辑  收藏  举报