我想要實作的有點像無線電組行為,一次只能選擇一個無線電輸入。例如,起始陣列[0, 1, 1, 1, 1, 1]應按以下方式交換其元素:
| 指數 | 大批 |
|---|---|
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;
}
我想知道您是否對如何使這個程序更簡單/更好有想法。
uj5u.com熱心網友回復:
只需用 標識前面的 0 findIndex,將 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)
);
uj5u.com熱心網友回復:
您可以使用切片和拼接來“一次性”旋轉子陣列,而不是交換對。
這是一個完成這項作業的函式,改變給定陣列(不回傳新陣列),以及一系列呼叫來演示它。我假設值可能會變化,并且需要保持在一起,就好像它們與“移動”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);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/417909.html
標籤:
