给定一个索引,相应地交换数组元素
Given an index, swap array elements accordingly
我想要实现的有点像无线电组行为,一次只能选择一个无线电输入。例如,起始数组 [0, 1, 1, 1, 1, 1]
应按以下方式交换其元素:
index
array
0
[0, 1, 1, 1, 1, 1]
1
[1, 0, 1, 1, 1, 1]
2
[1, 1, 0, 1, 1, 1]
3
[1, 1, 1, 0, 1, 1]
4
[1, 1, 1, 1, 0, 1]
5
[1, 1, 1, 1, 1, 0]
我想到了这个,但我认为它在某些情况下会做“额外的工作”(不必要的循环)。
function rearrange(array: number[], idx: number) {
let arr = array.slice();
let l = arr.length;
if (arr.indexOf(0) === idx) return arr;
while (arr.indexOf(0) !== idx) {
let swap;
for (let i = 0; i < l; i++) {
if (arr[i] === 0 || arr[i + 1] === 0) {
swap = arr[i];
if (i + 1 < l) {
arr[i] = arr[i + 1];
arr[i + 1] = swap;
}
if (i + 1 > l) {
arr[i] = arr[i - 1];
arr[i - 1] = swap;
}
}
}
}
return arr;
}
我想知道您是否有关于如何进行此过程的想法simpler/better。
只要用findIndex
识别前面的0,赋1给它,0赋给idx
?
function rearrange(array: number[], idx: number) {
const arr = [...array];
arr[arr.indexOf(0)] = 1;
arr[idx] = 0;
return arr;
}
另一种方法...
const rearrange = (array: number[], idx: number) => (
array.map((_, i) => i === idx ? 0 : 1)
);
您可以使用切片和拼接“一次性”旋转子阵列,而不是交换对。
这是一个完成这项工作的函数,它改变了给定的数组(不返回一个新数组),并用一系列调用来演示它。我假设值可能会发生变化并且需要保持在一起,就好像它们与“移动” 0:
交换一样
function rearrange(array, idx) {
let zero = array.indexOf(0);
if (zero < idx) {
arr.splice(zero, idx - zero + 1, ...arr.slice(zero + 1, idx + 1), 0);
} else {
arr.splice(idx, zero - idx + 1, 0, ...arr.slice(idx, zero));
}
}
arr = [0,1,2,3,4,5];
rearrange(arr, 3);
console.log(...arr);
rearrange(arr, 1);
console.log(...arr);
rearrange(arr, 5);
console.log(...arr);
rearrange(arr, 1);
console.log(...arr);
我想要实现的有点像无线电组行为,一次只能选择一个无线电输入。例如,起始数组 [0, 1, 1, 1, 1, 1]
应按以下方式交换其元素:
index | array |
---|---|
0 |
[0, 1, 1, 1, 1, 1] |
1 |
[1, 0, 1, 1, 1, 1] |
2 |
[1, 1, 0, 1, 1, 1] |
3 |
[1, 1, 1, 0, 1, 1] |
4 |
[1, 1, 1, 1, 0, 1] |
5 |
[1, 1, 1, 1, 1, 0] |
我想到了这个,但我认为它在某些情况下会做“额外的工作”(不必要的循环)。
function rearrange(array: number[], idx: number) {
let arr = array.slice();
let l = arr.length;
if (arr.indexOf(0) === idx) return arr;
while (arr.indexOf(0) !== idx) {
let swap;
for (let i = 0; i < l; i++) {
if (arr[i] === 0 || arr[i + 1] === 0) {
swap = arr[i];
if (i + 1 < l) {
arr[i] = arr[i + 1];
arr[i + 1] = swap;
}
if (i + 1 > l) {
arr[i] = arr[i - 1];
arr[i - 1] = swap;
}
}
}
}
return arr;
}
我想知道您是否有关于如何进行此过程的想法simpler/better。
只要用findIndex
识别前面的0,赋1给它,0赋给idx
?
function rearrange(array: number[], idx: number) {
const arr = [...array];
arr[arr.indexOf(0)] = 1;
arr[idx] = 0;
return arr;
}
另一种方法...
const rearrange = (array: number[], idx: number) => (
array.map((_, i) => i === idx ? 0 : 1)
);
您可以使用切片和拼接“一次性”旋转子阵列,而不是交换对。
这是一个完成这项工作的函数,它改变了给定的数组(不返回一个新数组),并用一系列调用来演示它。我假设值可能会发生变化并且需要保持在一起,就好像它们与“移动” 0:
交换一样function rearrange(array, idx) {
let zero = array.indexOf(0);
if (zero < idx) {
arr.splice(zero, idx - zero + 1, ...arr.slice(zero + 1, idx + 1), 0);
} else {
arr.splice(idx, zero - idx + 1, 0, ...arr.slice(idx, zero));
}
}
arr = [0,1,2,3,4,5];
rearrange(arr, 3);
console.log(...arr);
rearrange(arr, 1);
console.log(...arr);
rearrange(arr, 5);
console.log(...arr);
rearrange(arr, 1);
console.log(...arr);