我正在尝试使用以下规则返回数组:
1.所有与X
总和的独特组合
2.每个号码都分配了一个字母
3.每个字母只能使用一次
// Cartesian join
function cartesian() {
let r = []
let arg = arguments
let max = arg.length-1
function helper(arr, i) {
for (let j=0, l=arg[i].length; j<l; j++) {
let a = arr.slice(0); // clone arr
a.push(arg[i][j]);
if (i==max)
r.push(a);
else
helper(a, i+1);
}
}
helper([], 0);
return r;
}
let a = ['A','B','C'];
let a1 = ['1','2','3'];
let arrays = cartesian(a, a1)
for(let i=1; i<arrays.length; i++) {
file[i] = arrays[i].join('').toString();
}
笛卡尔连接将输出[A1,B1,C1,A2,B2 ......]
然后我如何将N个索引的组合加起来为X,而只使用每个字母索引的一个数字?
其中N是适用于总和的字母数。 其中X是总和。
例如,如果N = 3且X = 5,
输出为{A1,B1,C3},{A1,B2,C2},{A1,B3,C1},{B2,C3},{B3,C2}等......
答案 0 :(得分:0)
在您的示例中,您最多可以使用任意数字3次,因此我将从数组开始
[1,1,1,2,2,2,3,3,3]
然后查找总和为5的所有组合,同时使用最多3个条目并且仅使用每个条目一次。
找到数字后,您可以分配字母。例如,数字1,1,3
可以表示为A1,B1,C3
,A1,B3,C1
和A3,B1,C1
。如果您有三个不同的数字,将有六种方式来分配字母。
简而言之,首先找到数值解,然后分配字母。