LeetCode 1~n整数中1出现的次数 [中等]
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof
示例 1:
输入:n = 12
输出:5
示例 2:
输入:n = 13
输出:6
限制:
1 <= n < 2^31
题目分析
解法1
暴力法 while 循环每个数字,然后转成字符串之后再转为字符数组然后进行比较计数 但是会超时
解法2
数学解法 详细参见:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/solution/mian-shi-ti-43-1n-zheng-shu-zhong-1-chu-xian-de-2/ 我是怕我解释不明白
代码实现
public class CountDigitOne {
public static void main(String[] args) {
System.out.println(countDigitOne(20));
System.out.println(countDigitOne1(20));
}
public static int countDigitOne1(int n) {
int digit = 1, res = 0;
int high = n / 10, cur = n % 10, low = 0;
while (high != 0 || cur != 0) {
if (cur == 0) {
res += high * digit;
} else if (cur == 1) {
res += high * digit + low + 1;
} else {
res += (high + 1) * digit;
}
low += cur * digit;
cur = high % 10;
high /= 10;
digit *= 10;
}
return res;
}
public static int countDigitOne(int n) {
int result = 0;
n++;
while (n-- > 0) {
char[] res = String.valueOf(n).toCharArray();
for (char re : res) {
if (re == '1') {
result++;
}
}
}
return result;
}
}
网友评论