1~n 整数中 1 出现的次数(用时最快!超过100%)

package cn.tiger.funny;

/**
 * 1~n 整数中 1 出现的次数
 * @author jyuan
 *
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。

示例 1:
输入:n = 12
输出:5

示例 2:
输入:n = 13
输出:6
 

限制:
1 <= n < 2^31
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */
public class CountDigitOne {
    public int countDigitOne(int n) {
        long count = 0 ;
        int mark = 1;
        while (n/mark > 0) {
            count += (n/mark>10)? n/(mark*10)*mark : 0;  //防止超出int范围
            int smallPart = (n/mark>10)? n%(mark*10) : n;  //防止超出int范围
            if (smallPart/mark == 0 ) {
                // do nothing
            } else if (smallPart/mark == 1) {
                count += (smallPart%mark+1);
            } else {
                count += mark;
            }
            
            if(Integer.MAX_VALUE/mark>10) {  //防止超出int范围
                mark*=10;
            } else {
                break;
            }
        }
        return (int)count;
    }
    
    public static void main(String[] args) {
        CountDigitOne c = new CountDigitOne();
        System.out.println(c.countDigitOne(1410065408));
    }
}

 

posted @ 2021-01-25 16:11  预言2018  阅读(221)  评论(0)    收藏  举报