java算法----求从1到N中,某数出现的个数
时间: 2023-09-16 21:13:43 浏览: 80
可以使用数学方法和计算方法来求解这个问题。下面分别介绍两种方法。
1. 数学方法
假设要求数字 k 在 1 到 N 中出现的次数,可以将 N 分解为两部分,分别是 k 的最高位(高位)和除去最高位后的低位部分。设 N 的最高位为 h,设除去最高位后的低位部分为 l,则有以下三种情况:
1)h < k,此时 k 在 N 的最高位出现的次数为 l * 10^(n-1),其中 n 是 N 的位数;
2)h = k,此时 k 在 N 的最高位出现的次数为 l * 10^(n-1) + (N mod 10^(n-1)) + 1;
3)h > k,此时 k 在 N 的最高位出现的次数为 (l + 1) * 10^(n-1)。
参照以上三种情况,可以递归地求解出 1 到 N 中 k 出现的次数。具体实现可以参考下面的 Java 代码:
```
public static int countDigitOne(int n, int k) {
if (n <= 0 || k < 1 || k > 9) {
return 0;
}
int res = 0;
int digit = 1;
int high = n / 10;
int cur = n % 10;
int low = 0;
while (high != 0 || cur != 0) {
if (cur < k) {
res += high * digit;
} else if (cur == k) {
res += high * digit + low + 1;
} else {
res += (high + 1) * digit;
}
low += cur * digit;
cur = high % 10;
high /= 10;
digit *= 10;
}
return res;
}
```
2. 计算方法
另一种方法是直接计算 1 到 N 中 k 出现的次数。具体实现可以参考下面的 Java 代码:
```
public static int countDigitOne(int n, int k) {
if (n <= 0 || k < 1 || k > 9) {
return 0;
}
int res = 0;
int factor = 1;
int high = n / 10;
int cur = n % 10;
int low = 0;
while (high != 0 || cur != 0) {
if (cur == k) {
res += high * factor + low + 1;
} else if (cur < k) {
res += high * factor;
} else {
res += (high + 1) * factor;
}
low += cur * factor;
cur = high % 10;
high /= 10;
factor *= 10;
}
return res;
}
```
以上两种方法都可以求解从 1 到 N 中某数出现的次数,具体使用哪种方法可以根据实际情况选择。