我需要计算每个数字在数字序列中出现的次数,从1到 给定数字 。
示例:
输入:12
输出:5 2 1 1 1 1 1 1 1 1
说明:
1 2 3 4 5 6 7 8 9 1 0 1 1 1 2
第一个数字是1的数量,第二个是 - 两个......最后一个零
到目前为止,我已经写了一个函数将任何整数分成几部分(2512将是2000 500 10 2)。也许它对将来的执行很有用:
function splitToParts(x) {
var multiplier = 1;
while (x > 0) {
var result = x % 10;
if (result > 0) {
parts.unshift(result * multiplier);
}
x = Math.floor(x / 10);
multiplier *= 10;
}
}
答案 0 :(得分:0)
2000,500和10只是不是数字,所以对于直接计数,它们是不可行的。一个简单的方法是说你总是对最不重要的数字感兴趣("那些"),"消费"只要它不是0就可以了。
对于单个数字,就这么简单:
function digits(number){
var retval=[0,0,0,0,0,0,0,0,0,0];
while(number>0){
retval[number%10]++;
number=Math.floor(number/10);
}
return retval;
}
console.log(digits(123).join()); // join just makes it a single line, looks better

然后,可以通过接受它的参数来使统计数据可更新。它甚至不必是强制性的,如果它缺失,函数可以简单地创建它:
function digits(number,stats){
var retval=stats || [0,0,0,0,0,0,0,0,0,0];
while(number>0){
retval[number%10]++;
number=Math.floor(number/10);
}
return retval;
}
var stats=digits(123);
console.log(stats.join());
console.log(digits(234,stats).join());

然后让它循环:
function digits(number,stats){
var retval=stats || [0,0,0,0,0,0,0,0,0,0];
while(number>0){
retval[number%10]++;
number=Math.floor(number/10);
}
return retval;
}
function intervalDigits(min,max){
var stats;
for(var i=min;i<=max;i++)
stats=digits(i,stats);
return stats;
}
console.log(intervalDigits(1,12).join());
&#13;
这将是一个强大的力量&#34;,但是在JavaScript中的工作解决方案。
然后人们可以去数学而不是暴力强迫,并开始使用2000-500-10-2&#34;分解&#34;,找到&#34;贡献&#34;对于数字&#39;,&#39;数&#39;数百&#39;等数字的统计数据,依此类推。这些贡献不会是微不足道的,因此现有的片段可能有助于检查不同的转换周围会发生什么。#/ p>
function digits(number,stats){
var retval=stats || [0,0,0,0,0,0,0,0,0,0];
while(number>0){
retval[number%10]++;
number=Math.floor(number/10);
}
return retval;
}
function intervalDigits(min,max){
var stats;
for(var i=min;i<=max;i++)
stats=digits(i,stats);
return stats;
}
for(var i=1;i<21;i++)console.log("1-"+i,intervalDigits(1,i).join());
console.log("---");
for(var i=95;i<115;i++)console.log("1-"+i,intervalDigits(1,i).join());
console.log("---");
var x100=intervalDigits(1,100);
var x200=intervalDigits(1,200);
var x300=intervalDigits(1,300);
console.log("1-100",x100.join());
console.log("1-200",x200.join());
console.log("1-300",x300.join());
console.log("---");
console.log("1-100 -> 1-200",x200.map((x,i)=>x-x100[i]).join());
console.log("1-200 -> 1-300",x300.map((x,i)=>x-x200[i]).join());
console.log("1-100 -> 1-300",x300.map((x,i)=>x-x100[i]).join());
&#13;
考虑到10 18 的范围,你很可能会追求这条赛道(也是),但是现在这个&#39;起始包装&#39;是我有时间的。