找到给定范围之间的最大不相似数字

时间:2013-03-06 09:20:09

标签: algorithm math numbers

如果a <= 10 * b且b <= 10 * a,则认为两个数字(a,b)相似。现在给出两个范围低和高,返回一个包含给定范围之间的最大no非相似数字的集合。

我只能想到蛮力方法。只需要了解如何以更好的复杂性解决这个问题。

2 个答案:

答案 0 :(得分:3)

根据你的描述,我看到两个数字相似,如果它们中的较大数字不比小数字大10倍。因此,如果您想从范围[低...高]中找到最大数字集,以便该集合中没有两个数字相似,那么解决方案将是从该范围中的最小数字开始,即从“低”开始,并且每次都取下一个与集合中任何数字不相似的最小数字(如果你只是检查它是否与集合中的最大元素不相似,则相同)。

算法:

,然后 10 * low + 1 10 *(10 * low + 1)+ 1 等......直到超过限制。

答案 1 :(得分:0)

如果我理解正确的问题,这应该有效:

// start with smallest number:

var numbers = [];
var number = range.lowest;
// while not reached end of range
while (number <= range.highest) {
    // add this number;
    numbers.push(number);
    // find next not similar number
    number = numbers * 10 + 1;
}

// start with highest number:

var numbers = [];
var number = range.highest;
// while not reached end of range
while (number >= range.lowest) {
    numbers.push(number);
    // find next non-similar number
    var newNumber = Math.floor(number / 10.0);
    if (numNumber == number / 10.0);
        newNumber--;
    number = newNumber;
}

后一种方法可能会找到比第一种方法更多的数字,尝试一下。但是,可能总会存在不同类型的非相似数字,且大小可能相同。