【贼容易理解】31.整数中1出现的次数

整数中1出现的次数(从1到n整数中1出现的次数)

http://www.nowcoder.com/questionTerminal/bd7f978302044eee894445e244c7eee6

解法一:计算高低位(推荐,因为十分利于理解)

思路

若百位上数字为 0,百位上可能出现 1 的次数由更高位决定;若百位上数字为 1,百位上可能出现 1 的次数不仅受更高位影响还受低位影响;若百位上数字大于 1,则百位上出现 1 的情况仅由更高位决定。

代码

图片说明

解法二:公式法(其实和解法一一致)

思路

只要理解了解法一,解法二就能够完全理解,直接看代码即可,加8就是因为,只要当前位比1大那就肯定覆盖了所有1的部分,就像212和220虽然相差了8但是他们含有的1的个数是完全一样多的

代码

public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        if (n <= 0)
            return 0;
        int count = 0;
        for (int m = 1; m <= n; m *= 10) {
            int a = n / m, b = n % m;//a为当前位,b为当前位的余数(个位的余数就是本身)
            count += (a + 8) / 10 * m + (a % 10 == 1 ? b + 1 : 0);
        }
        return count;
    }
}
全部评论

相关推荐

把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
10-05 10:13
已编辑
HHHHaos:让这些老登来现在秋招一下,简历都过不去
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务