统计数字
描述:
计算数字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)
解题思路1:
先将大问题分解成小问题,题目中需要统计0-n中出现的次数,可以判断一个数中出现了几次k,在累计即可得到共出现的次数。
问题就变成了,给定一个数,判断其共出现了多少次k。一个数可能有个位、十位、百位、千位,统计这些位是否含有数字k,即可得到整个数含有k的次数,那么,如何判断个十百千位是否含有k呢?这就涉及到数字的拆分,通过不断取模、除以10的操作,得到每一位,例如,123这个数,123%10=3,123/10取整得12,12%10=2,12/10=1,通过模10、除以10的操作,得到3、2、1等百位、十位、个位数字。累加所得的数字,即可得到结果。代码(javascript)
const digitCounts = function (k, n) {
let count = 0; //k累计出现的次数
for (let i = 0; i <= n; i++) {
let j = i;
while (j > 9) //如果j有十位或以上,就重复取位的操作
{
if ((j % 10) == k) {
count++; //j的某位含有数字k
}
j = parseInt(j / 10);//这里要强制转化为整数类型,如果是强类型的语言则不需要
}
if (j == k) {
count++;
}
}
return count;
}
- 解体思路2:
将数字当成字符串处理,将0-n的所有数字拼接成一个大字符串,在遍历这个字符串,统计k出现的次数。
这种方法代码量少,更为简单,复杂度为n,从复杂度上来说不是最优。
const digitCounts = function (k, n) {
let result=0;
let str='';
k=k+''; //将k转化为字符串,方便后面比较
for(let i=0;i<=n;i++){
str+=i; //将0-n的数拼接成大字符串
}
for(let i=0;i<str.length;i++){
if(str[i]===k){
result++; //统计字符串k出现的次数
}
}
return result;
}