题目链接:
https://www.lintcode.com/problem/digit-counts/description
描述
计算数字k在0到n中的出现的次数,k可能是0~9的一个值
您在真实的面试中是否遇到过这个题? 是
样例
例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我们发现1出现了5次 (1, 10, 11, 12)
代码实现:
package 中等题1;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
int k = 1;
int n = 12;
System.out.println(digitCounts(1,12));
}
public static int digitCounts(int k, int n) {
int num = 0;
for (int i = k; i <= n; i++){
//整数变成字符串
String s = String.valueOf(i);
//字符串变成字符数组
char[] ss = s.toCharArray();
for (int j = 0; j < s.length(); j++){
//字符变成整数
int a = Character.getNumericValue(ss[j]);
if (a == k){
num++;
}
}
}
return num;
}
}
代码实现2:数学方法获得)通过与10的余数得到末位,通过与10除去掉末位,构成一个循环,就可以分析一个数的所有位。然后把所有位都加起来(从局部到整体)
public int digitCounts(int k, int n) {
int cnt = 0;
for (int i = k; i <= n; i++) {
//分次计算每一个数中含有k的个数
cnt += singleCount(i, k);
}
return cnt;
}
public int singleCount(int i, int k) {
//排除0的情况
if (i == 0 && k == 0)
return 1;
int cnt = 0;
while (i > 0) {
//判断末尾是否为k
if (i % 10 == k) {
cnt++;
}
//去掉末尾再次循环,直到去除完所有位跳出循环
i = i / 10;
}
return cnt;
}
网友评论