我有一种情况,我需要将未知长度的整数的随机数组转换为多对 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]]
有一些约束需要遵循,例如:
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/