我有一种情况,我需要将未知长度的整数的随机数组转换为多对 2。

前任:

var numbers = [1, 5, 0, 7, 5, 5, 1, 7, 5, 1, 2, 1];

-----------------------------------------------------
[[1, 5], [0, 7], [5, 5], [1, 7], [5, 1], [2, 1]]

有一些约束需要遵循,例如:
  • 应该正好有 6 对(每对 2 个数字)。
  • 如果 numbers 数组中没有足够的数字来组成 6 对,则生成一个介于 1-9 之间的数字。
  • numbers 数组中的每一项只能使用一次。
  • 每对必须是唯一的。但是例如 [1,2][2,1] 可以被认为是不同的对。
  • 一对不能包含 [0, 0]

  • 到目前为止,我发现了一个可以找到组合的函数,但是一旦它已经使用过它就不会忽略索引。

    var numbers = [1, 5, 0, 7, 5, 5, 1, 7, 5, 1, 2, 1];
    
    function p(t, i) {
      if (t.length === 2) {
        result.push(t);
        return;
      }
      if (i + 1 > numbers.length) {
        return;
      }
    
      p(t.concat(numbers[i]), i + 1);
      p(t, i + 1);
    }
    
    var result = [];
    p([], 0);
    console.log(result);
    

    我接下来该怎么做?

    最佳答案

    尽管 Nina 关于 OP 只需要未知长度数组中的前 N ​​对可能是正确的,但这里有一个额外的检查(以及稍微不同的解决问题的方法):

    const nums1 = [1, 5, 0, 7, 5, 5, 1, 7, 1, 5, 1, 5];
    const nums2 = [1, 5, 0, 7, 5, 5, 1, 7, 5, 1, 2, 1];
    const nums3 = [1, 5, 0, 7, 5, 5, 0, 0, 5, 1, 2, 1, 0, 0, 1, 8];
    const nums4 = [1, 5, 0, 7, 1, 6, 5, 5, 0, 0, 5, 8, 8, 5, 5, 1, 2, 1, 0, 0, 1, 8];
    const log = pairs => console.log(JSON.stringify(pairs));
    log(createPairs(nums1, 6));
    log(createPairs(nums2, 6));
    log(createPairs(nums3, 6));
    log(createPairs(nums4, 5));
    log(createPairs(nums4, 5, true));
    
    function createPairs(numbers, len, truncate) {
      let pairs = [];
      let i = 0;
      const existingValues = new Set(['0|0']);
      const randomDigit = n => Math.floor(Math.random() * (n + 1));
    
      // create and complete array of [len] unique pairs, not being [0, 0]
      while (pairs.length < len) {
        const pair = i + 2 <= numbers.length
          ? numbers.slice(i, i += 2)
          : [randomDigit(9), randomDigit(9)];
        const pairStr = pair.join(`|`);
        !existingValues.has(pairStr) && pairs.push(pair);
        existingValues.add(pairStr);
      }
    
      return i + 2 < numbers.length && !truncate
        ? `This would deliver more pairs than desired (${len})`
        : pairs;
    }
    .as-console-wrapper {
      top: 0;
      max-height: 100% !important;
    }

    关于javascript - 如何将数字列表转换为唯一的两个数字对,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60360671/

    10-12 00:00
    查看更多