【问题标题】:Create new non-duplication sequence in JavaScript?在 JavaScript 中创建新的非重复序列?
【发布时间】:2021-11-19 07:09:53
【问题描述】:

[问题]

John 创建了一个仅由 1、2 和 3 组成的序列条码,他希望重新创建一种算法,该算法可以随着对象数量的增加创建一个不同于现有序列条码的新序列条码。 当您说您必须从 1 到 N 的自然数中选择 M 且长度应为 M 时,请创建一个函数以返回您可以在数组中制作的所有条形码。 条件序列必须按照字典顺序递增的顺序输出。条形码必须返回数字。

[输入]

Factor 1:nNumber 类型从 1 到 10 的自然数 因子 2:mNumber 类型从 1 到 n 的自然数 $ 你必须返回一个包含输出数字列表的数组。

[输入输出示例]

所有条形码不应有相同的编号。

  • N 为 2,M 为 1,您必须使用 1 或 2 来创建适合 1 长度的条形码。 构造1 = test2 (2, 1); 控制台.log(输出1); // --> [1, 2]

  • N 为 3,M 为 2,您必须使用 1、2 和 3 创建一个适合 2 长度的条形码。 构造2 = test2 (3, 2); 控制台.log(输出2); //-> [12, 13, 21, 23, 31, 32]

这是我写的代码。

function solution(m, arr){         
    let answer=[];
    n=arr.length;
    let ch=Array.from({length:n},()=>0);
    let tmp=Array.from({length:m},()=>0);
    function DFS(L){
        if(L===m){
            answer.push(tmp.slice());
        }
        else{
            for(let i=0; i<n; i++){
                if(ch[i]===0){
                    ch[i]=1;
                    tmp[L]=arr[i];
                    DFS(L+1);
                    ch[i]=0;
                }
            }
        }
    }
    DFS(0);
    return answer;
}

let arr=[3, 6, 9];
console.log(solution(2, arr));

从代码中可以看出,与问题中需要的因子不同,我将数组放入因子中。 但是我想输入自然数并将它们输出到一个数组中,就像我在输入输出示例中所做的那样。 解决这个问题的好方法是什么?

【问题讨论】:

  • 我并没有完全理解这个问题(我是否正确,您为此使用了英语的自动翻译?)但是如果问题是如何取自然数 4,并将其转化为数组[1, 2, 3, 4],然后可以搜索range函数。它们相当容易编写。

标签: javascript arrays algorithm permutation


【解决方案1】:

对您的问题最简单的答案是您可以使用range 函数,该函数给定一个开始和结束自然数,返回包含它们之间的所有整数(包括它们的端点)的数组。我们可以这样写:

const range = (low, high) =>
  [...Array (high - low + 1)].map ((_, i) => i + low)

然后我们可以调用range(1, 4)获取[1, 2, 3, 4]。虽然我们可以跳过low 参数,但这个函数更有用,因为我们可以将它用于range(3, 12) //=&gt; [3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

你的版本只需要做这个最小的改变:

function solution(m, arr){         
    let answer=[];
// ...

变成

function solution(m, n){
    let arr = range(1, n);         
    let answer=[];
// ...

(虽然我认为参数顺序可能与预期不符。)


但我认为你的直觉在这里是正确的。您编写的函数具有比所要求的更有用的 API。我建议您将solution 原样重命名为其他名称,例如words,然后编写一个简单的新solution,它采用mn,并调用它。

function solution (m, n) {
  return words (m, range (1, n))
}

这是相同想法的另一个版本,使用words的递归版本:

const range = (lo, hi) =>
  [...Array (hi - lo + 1)].map ((_, i) => i + lo)

const excluding = (n) => (xs) =>
  xs .filter (x => x != n)

const words = (alphabet, length) =>
  length == 0
    ? []
  : length == 1
    ? alphabet .map (String)
  : alphabet .flatMap (a => words (excluding (a) (alphabet), length - 1) .map (w =>a + String(w)))

const barcodes = (n, m) => 
  words (range (1, n), m)

console .log (barcodes (2, 1)) //=> ["1", "2"]
console .log (barcodes (3, 2)) //=> ["12", "13", "21", "23", "31", "32"]
console .log (barcodes (4, 2)) //=> ["12", "13", "14", "21", "23", "24", 
                               //    "31", "32", "34", "41", "42", "43"]
console .log (barcodes (4, 3)) //=> ["123", "124", "132", "134", "142", "143", "213", "214", 
                               //    "231", "234", "241", "243", "312", "314", "321", "324", 
                               //    "341", "342", "412", "413", "421", "423", "431", "432"]
console .log (barcodes (0, 3)) //=> []
.as-console-wrapper {max-height: 100% !important; top: 0}

【讨论】:

  • Sauyet 现在好像有点难以理解,不过我会通过看你写的代码来学习理解。非常感谢您回答问题。
  • 如果您对此有任何疑问,请随时在 cmets 中提问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
相关资源
最近更新 更多