給定陣列 ( ) n,我想填充一個元素陣列,使其對角線具有相同的值,如下所示:valuesvalues.length = 2 * n - 1n x n
前任。n = 3,值 = [0, 1, 2, 3, 4]:
0 1 2
3 0 1
4 3 0
arr = [0, 1, 2, 3, 0, 1, 4, 3, 0]
前任。n = 4,值 = [0, 1, 2, 3, 4, 5, 6];
0 1 2 3
4 0 1 2
5 4 0 1
6 5 4 0
arr = [0, 1, 2, 3, 4, 0, 1, 2, 5, 4, 0, 1, 6, 5, 4, 0]
我能夠使用以下代碼填充陣列的上半部分,但被其余部分卡住了:
var n = 3;
var values = [0, 1, 2, 3, 4]
var a = [];
for (var i = 0; i < n; i ) {
for (var j = 0; j < n; j ) {
a[j * n i] = values[i - j];
}
}
/* Result
0 1 2
0 1
0
arr = [0, 1, 2, undefined, 0, 1, undefined, undefined, 0]
Expected output:
0 1 2
3 0 1
4 3 0
arr = [0, 1, 2, 3, 0, 1, 4, 3, 0] */
陣列的長度values是2 * n - 1,它是陣列的對角線數。
任何想法如何填充整個陣列?
uj5u.com熱心網友回復:
創建了while回圈并添加了計數器。計數器計算假定從末端切割的元素。第一個回圈遍歷這些元素并將它們添加到開頭,第二個回圈受此計數器限制,因此它不會到達陣列的末尾,并且它將尚未從陣列中洗掉的元素添加到末尾。直到從陣列中洗掉所有元素。
var values = [0, 1, 2, 3, 4]
var a = [];
var ctr = 0
while(ctr < values.length){
for(let i = (values.length - ctr); i < values.length; i ){
a.push(values[i]);
}
for(let i = 0; i < (values.length - ctr); i ){
a.push(values[i]);
}
ctr ;
}
輸出
[0, 1, 2, 3, 4, 4, 0, 1, 2, 3, 3, 4, 0, 1, 2, 2, 3, 4, 0, 1, 1, 2, 3, 4, 0]
0 1 2 3 4
4 0 1 2 3
3 4 0 1 2
2 3 4 0 1
1 2 3 4 0
uj5u.com熱心網友回復:
好的,我看到了請求的結果并在下面制作了這個片段我使用二維陣列來檢查是否存在使用 xy 邏輯的現有對角線,如果沒有,則有一個計數器可以參考下一個陣列編號(c 1%arr.length)
編輯解釋:我看到發生了什么然后我決定只在那個“地方”沒有對角線時嘗試添加..它就像一個魅力??
var arr=[0,1,2,3,4]
function makeBox(arr,n){
var toReturn=[], c=0
for(let i=0;i<n*n;i ){
let y=(i-(i%n))/n, x=i%n
let diagonal=toReturn[y-1]?toReturn[y-1][x-1]:undefined
let isDiagonal=typeof diagonal==="number" //0 is a number
toReturn[y]?toReturn[y].push(isDiagonal?diagonal:arr[c]):
toReturn[y]=[isDiagonal?diagonal:arr[c]]
if(!isDiagonal){c=(c 1)%arr.length}
}
return toReturn.map(a=>a.join(' ')).join('\n')
}
console.log(makeBox(arr,3))
console.log(makeBox(arr,4))
console.log(makeBox(arr,6))
console.log("before you say that it doesn't work.. you just need the correctly sized array\nLook Below")
console.log(makeBox([0,1,2,3,4,5,6],4))
uj5u.com熱心網友回復:
下面介紹的是實作預期目標的一種可能實作:
const values = [0, 1, 2, 3, 4];
const getCustomArray = (n = 3, val = values) => {
const res = [...Array(n)].map(x => [...Array(n).fill(-1)]);
for (let i = 0; i < n; i ) {
res[i][i] = val[0];
for (let j = 1; i j < n; j ) {
res[i][i j] = val[j];
res[i j][i] = val[n j - 1]
}
}
return res.map(r => r.join(' ')).join('\n');
};
console.log('3 x 3 array:\n' getCustomArray());
console.log('4 x 4 array:\n' getCustomArray(4, [...Array(2 * 4 -1).keys()]));
console.log('5 x 5 array:\n' getCustomArray(5, [...Array(2 * 5 -1).keys()]));
console.log('9 x 9 array:\n' getCustomArray(9, [...Array(2 * 9 -1).keys()]));
方法
n首先,創建一個行和列陣列n并用一些值(例如-1)填充。- 接下來,
ifor回圈遍歷對角線集 - ,
0,0,對1,1角2,2元素設定為values陣列的第一個元素(通常為0)。 - 現在,第二個
jfor 回圈迭代。 - 它更新上下對角線。
res[i][i j]定位上對角線(例如0,1,1,2,2,3, ...)并使用values陣列填充res[i j][j]以較低的對角線為目標(例如1,0,2,1,3,2, ...)并使用offsetof來填充陣列的n - 1索引values
請在評論中添加任何問題或反饋。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/440662.html
標籤:javascript 数组
