我们有一个数值数组,每个元素都有任意最大值。我们如何递增元素以使数组从[0, 0, 0]
变为[x, y, z]
?
为了说明最大数组是[2, 1, 2]
并且我们在[0, 0, 0]
处开始主数组递增应该使主数组通过以下步骤:
[0, 0, 0]
[1, 0, 0]
[2, 0, 0]
[0, 1, 0]
[1, 1, 0]
[2, 1, 0]
[0, 0, 1]
[1, 0, 1]
[2, 0, 1]
[0, 1, 1]
[1, 1, 1]
[2, 1, 1]
[0, 0, 2]
[1, 0, 2]
[2, 0, 2]
[0, 1, 2]
[1, 1, 2]
[2, 1, 2]
我写了一个函数,一旦达到最大值1就停止递增。这是我的代码:
var maxes = [2, 1, 2];
var myArray = [0, 0, 0];
function step() {
for(var i = 0; i < myArray.length; i++) {
if(myArray[i] == maxes[i]) {
continue;
} else {
myArray[i] = myArray[i] + 1;
return;
}
}
return false;
}
for(j = 0; j < 100; j++) {
result = step();
if(!result) break;
console.log(result);
}
答案 0 :(得分:0)
你需要两个循环 - 每个maxes
元素一个,当前有4个,但我不确定你是否打算将它改为动态;以及另一个循环,它将增加每个元素的值,直到它达到maxes
的极限值。
答案 1 :(得分:0)
你只有一些错误可以解决:
var maxes = [3, 1, 2, 1];
var myArray = [0, 0, 0, 0];
function step() {
var changed = false;
for(var i = 0; i < myArray.length; i++) {
if(myArray[i] == maxes[i]) {
continue;
} else {
myArray[i] = myArray[i] + 1;
changed = true;
}
}
return changed;
}
for(j = 0; j < 100; j++) {
result = step();
if(!result) break;
console.log(myArray.join(", "));
}
答案 2 :(得分:0)
这是一个更简单,更有效的解决方案:只需使用一个变量 pos 来存储数组中的当前位置。一旦我们在当前位置达到最大值,我们将当前位置增加1,否则增加当前位置的值。 而这个过程你只是不断重复,直到 pos 达到最后一个值和,最后一个值是最大值。
var maxes = [3, 1, 2, 1];
var myArray = [0, 0, 0, 0];
var pos = 0;
while (pos < myArray.length - 1 || myArray[pos] < maxes[pos]) {
if (myArray[pos] >= maxes[pos]) {
myArray[pos] = 0; // to set it back to zero
pos++;
continue;
}
myArray[pos]++;
// Step code here
}
适用于任何大小的数组。这是一个jsfiddle
答案 3 :(得分:0)
公平披露:这是我自己的问题。我无权访问我的SO或电子邮件登录,并使用刚为朋友创建的新帐户发布此问题。我不是在回答这个问题,也不是他的答案。我也不会让我的朋友将我的答案标记为已接受。无论如何,我解决了这个问题并最终得到了这个有效的代码:
var maxes = [4,1,2,3];
var pattern = [0,0,0,0];
function step() {
var t = false;
for(var k = 0; k < pattern.length; k++) {
t = t || (pattern[k] < maxes[k]);
}
if(!t) return false;
for(k = 0; k < pattern.length; k++) {
if(pattern[k] < maxes[k]) {
pattern[k]++;
return true;
} else {
pattern[k] = 0;
continue;
}
return false;
}
}
console.log(pattern);
var r = true;
while(r) {
r = step();
console.log(pattern);
}
JSBin here。
答案 4 :(得分:0)
我几天前重新审视了这个问题,并重新编写了一些代码。
首先要正确理解问题,它相当于在混合基数系统中计数。在这个系统中,我们每个位置/数字有一个任意的基数。如果所有最大值都是2,例如问题那么将在base-2中计数,但每个位置的最大值可能是不同的数字,因此, hybrid 基本系统。
中心功能实际上非常简单:
// increment in hyper system
function incr(maxes,num,digit) {
num[digit] = num[digit] + 1;
num[digit] = num[digit] % (maxes[digit]+1);
if(num[digit] === 0) incr(maxes,num,digit+1);
}
这是一个有效的jsbin。