间隔内的位数

时间:2018-03-03 23:28:18

标签: javascript combinatorics

我需要计算每个数字在数字序列中出现的次数,从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;
                }
            }

1 个答案:

答案 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;
&#13;
&#13;

这将是一个强大的力量&#34;,但是在JavaScript中的工作解决方案。

然后人们可以去数学而不是暴力强迫,并开始使用2000-500-10-2&#34;分解&#34;,找到&#34;贡献&#34;对于数字&#39;,&#39;数&#39;数百&#39;等数字的统计数据,依此类推。这些贡献不会是微不足道的,因此现有的片段可能有助于检查不同的转换周围会发生什么。#/ p>

&#13;
&#13;
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;
&#13;
&#13;

考虑到10 18 的范围,你很可能会追求这条赛道(也是),但是现在这个&#39;起始包装&#39;是我有时间的。