https://blog.csdn.net/guliguliguliguli/article/details/126089434
知识分类篇 - 其他算法 - JZ43 整数中1出现的次数(从1到n整数中1出现的次数)
遍历从1到n的每一个数,首先判断这个数的范围,然后计算每一位上的数字是不是1
import java.util.*;
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
if (n == 0) {
return 0;
}
int cnt = 0;
for (int i = 1; i <= n; i++) {
cnt += cal(i);
}
return cnt;
}
private int cal(int i) {
if (i < 10) {
return (i % 10 == 1 ? 1 : 0);
} else if (i < 100) {
return (i % 10 == 1 ? 1 : 0) + ((i / 10) % 10 == 1 ? 1 : 0);
} else if (i < 1000) {
return (i % 10 == 1 ? 1 : 0) + ((i / 10) % 10 == 1 ? 1 : 0) + ((i / 100) % 10 == 1 ? 1 : 0);
} else if (i < 10000) {
return (i % 10 == 1 ? 1 : 0) + ((i / 10) % 10 == 1 ? 1 : 0) + ((i / 100) % 10 == 1 ? 1 : 0) + ((i / 1000) % 10 == 1 ? 1 : 0);
}else {
return (i % 10 == 1 ? 1 : 0) + ((i / 10) % 10 == 1 ? 1 : 0) + ((i / 100) % 10 == 1 ? 1 : 0) + ((i / 1000) % 10 == 1 ? 1 : 0) + ((i / 10000) % 10 == 1 ? 1 : 0);
}
}
}
import java.util.*;
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
int cnt = 0;
for (int i = 1; i <= n; i++) {
for (int j = i; j > 0; j /= 10) {
if (j % 10 == 1) {
cnt++;
}
}
}
return cnt;
}
}
这里的按位计算,就比如,传入的n是12235
import java.util.*;
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
int res = 0;
//MulBase = 10^i
long MulBase = 1;
//每位数按照公式计算
while (MulBase <= n){
//根据公式添加
res += (n / (MulBase * 10)) * MulBase + Math.min(Math.max(n % (MulBase * 10) - MulBase + 1, (long) 0), MulBase);
//扩大一位数
MulBase *= 10;
}
return res;
}
}
以12235为例,答案是:7990
计算个位上1出现的次数:
计算十位上1出现的次数:
计算百位上1出现的次数:
计算千位上1出现的次数:
计算万位上1出现的次数
将所有结果加起来
1224+1230+1300+2000+2236=7990,与代码运行结果一样