【问题标题】:Finding maximum disimilar numbers between given range查找给定范围之间的最大不同数
【发布时间】:2013-03-06 09:20:08
【问题描述】:

如果 a

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

【问题讨论】:

  • 你能更正/改写你的帖子并注意你的语法吗?真的很难理解你的意思。
  • @marsze 问题已明确说明.. 你有什么不清楚的地方
  • 我不明白这句话“返回一个集合,包含给定范围内最大数量的非相似数字”你能详细说明或举例吗?

标签: algorithm math numbers


【解决方案1】:

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

算法:

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

【讨论】:

  • 你能解释一下这个答案背后的逻辑吗?为什么总是从低开始。
  • 不一定要从低开始,但这样更容易让人理解/更自然地向上计数。您也可以通过以下方式解决此问题:取 high,然后取 high / 10 - 1ans / 10 - 1 等,直到下一次计算答案低于 low 限制。
  • 当然,有趣的一点是证明/反驳无论从下端还是上端开始,你得到相同数量的元素;)
  • 上述方法的复杂性是什么......记住我需要找到一个最大没有非异类元素的集合......所以我需要在算法之上运行从低到高的所有数字......对吗?
  • 这种方法的复杂度是 O(log10(high - low)),所以它非常快。关于证明,如果我们从 high 开始并向后退,我们以相反的顺序执行相同的操作(除以 10 并增加 1),我们最终将在某个等于或接近 low,这意味着我们可以从那个位置开始,然后通过获得相同的数字向高位前进。所以后退或前进不会改变答案。
【解决方案2】:

如果我正确理解了问题,这应该可以:

// 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;
}

后一种方法可能会比第一种方法找到更多的数字,试试吧。但是,可能总会有大小相同的不同的不相似数集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2013-02-21
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多