时间:2025-09-18 09:00
人气:
作者:admin
求出 1~13 的整数中1出现的次数,并算出 100~1300 的整数中 1 出现的次数?为此他特别数了⼀下 1~13 中包含 1 的数字有 1、10、11、12、13 因此共出现 6 次,但是对于后⾯问题他就没辙了。 ACMer 希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意⾮负整数区间中 1 出现的次数(从 1 到 n 中 1 出现的次数)。
输入:13
输出:6
public class Solution {
public int countDigitOne(int n) {
if (n <= 0) {
return 0;
}
int count = 0;
for (int i = 1; i <= n; i++) {
int num = i;
while (num > 0) {
if (num % 10 == 1) { // 检查当前位是否为1
count++;
}
num /= 10; // 移除最后一位
}
}
return count;
}
}
这道题如果使⽤暴⼒破解,肯定是会超时的,所以我们需要看看这⾥⾯有没有啥规律。
递归法通过将数字按位拆分来解决问题。以数字 21345 为例,可以将其分为 1-1345 和 1346-21345 两部分。1346-21345 中 1 的出现次数可以分为两种情况
(除去最高位后的数字 + 1)次。2 * 4 * 1000 = 8000。然后再递归地计算 1-1345 中 1 出现的次数public class Solution {
public int countDigitOne(int n) {
if (n <= 0) return 0;
if (n < 10) return 1; // 1-9只有1个1
String str = String.valueOf(n);
int len = str.length();
int firstDigit = str.charAt(0) - '0'; // 获取首位数字
int remainder = n % (int)Math.pow(10, len - 1); // 获取除首位后的余数
int power = (int)Math.pow(10, len - 2); // 用于计算其他位出现1的次数
int countFirstDigit = 0;
// 计算最高位出现1的次数
if (firstDigit > 1) {
countFirstDigit = (int)Math.pow(10, len - 1);
} else if (firstDigit == 1) {
countFirstDigit = remainder + 1;
}
// 计算其他位出现1的次数
int countOtherDigits = firstDigit * (len - 1) * (int)Math.pow(10, len - 2);
// 递归计算剩余部分(1到 remainder)中1出现的次数
int countRemainder = countDigitOne(remainder);
return countFirstDigit + countOtherDigits + countRemainder;
}
}
这是通过数学推导直接计算每一位上 1 出现的次数,然后求和。
对于每一位(个位、十位、百位...),我们可以将数字 n 划分为三部分:
根据当前位 cur的值,1 的出现次数有以下三种情况:
high * digit。high * digit + low + 1。(high + 1) * digit。public class Solution {
public int countDigitOne(int n) {
if (n <= 0) return 0;
int count = 0;
long digit = 1; // 位因子,从个位开始
int high = n / 10; // 高位
int cur = n % 10; // 当前位
int low = 0; // 低位
while (high != 0 || cur != 0) {
if (cur == 0) {
count += high * digit;
} else if (cur == 1) {
count += high * digit + low + 1;
} else {
count += (high + 1) * digit;
}
// 更新低位、当前位、高位和位因子
low += cur * digit;
cur = high % 10;
high = high / 10;
digit *= 10;
}
return count;
}
}
本文来自在线网站:seven的菜鸟成长之路,作者:seven,转载请注明原文链接:www.seven97.top
上一篇:wso2~系统端口总结
下一篇:wso2~api的高级限流策略
【从0到1构建一个ClaudeAgent】协作-Agent团队