在字典中查找定义数量的数字

时间:2018-12-22 16:35:08

标签: sorting lexicographic

我正在努力解决以下问题。

想象一下,我有6个糖果,我必须给这些糖果分配6个孩子,而每个孩子都不能超过2个糖果。

示例: 000222 121020

我需要实现的是按字典顺序查找所有可能的解决方案,因此对于与上述相同的示例,它会像这样。

000222 001122 001212 001221

我写了一个算法来创建一个基本的解决方案,它将给我第一个字典上的解决方案(在上面的例子中,它会给我结果000222),然后我写了另一种算法,它总是在字典上找到我的下一个解决方案命令,因此,如果我向该算法发送000222,它将给我001122。

我的问题是我的算法无法正常运行,这是我在需要此类算法时编写算法的方式:

console.log(nextSchedule("001221"))

当正确答案为002022时,它会给我002121。我理解为什么我的算法会这样做,但是我不知道如何进行改进才能处理这些情况。

我正在按原样发送nextSchedule算法。

有人可以给我一些指导使其工作吗?

谢谢!

function nextSchedule(currentSchedule) {
    let newSchedule = currentSchedule.split('');
    for (let i = newSchedule.length - 1; i > 0; i--) {
        if (newSchedule[i] > newSchedule[i - 1]) {
            newSchedule[i]--;
            newSchedule[i - 1]++;
            break;
        }
    }
    newSchedule = newSchedule.join('');
    return newSchedule === currentSchedule ? null : newSchedule;
}

1 个答案:

答案 0 :(得分:0)

建议:假设您的目标是产生所有可能的数字000000到222222,其中每个数字的范围只能是0到2。您的方法将通过输入数字,然后在最右边的数字加1来实现。如果结果大于2,则将其环绕到0,然后将1移到紧靠左边的数字上。重复直到没有结转。

(这就像您要在纸上添加两个数字,只是停在2而不是9)。

但是,您现在有一个附加的约束:您只希望给出总共六个糖果的数字(即:数字中所有数字的总和为6)。因此,请添加该签入内容-如果“下一个”数字加起来不等于6,则只需继续重复该过程,直到找到一个数字即可。

基本上,您将遍历所有729个6位以3为底的数字,但扔掉不符合您条件的数字。