我已經得到了原始2D array數量和列是相同的。
我需要像這樣填充對角線元素:
1 0 1
0 1 0
1 0 1
這是我的代碼:
private static void fillDiagonal() {
int[][] arr = new int[3][3];
// System.out.println(Arrays.deepToString(arr));
for (int i = 0; i < arr.length; i ) {
for (int j = 0; j < arr[i].length; j ) {
arr[i][i] = 1;
arr[0][2] = 1;
arr[2][0] = 1;
}
}
System.out.println(Arrays.deepToString(arr));
}
它有效,但我需要從硬編碼值更改它。
arr[0][2] = 1;
arr[2][0] = 1;
用回圈填充它
如何實作?
uj5u.com熱心網友回復:
不需要兩個for回圈。您可以在 中執行此操作O(n),因為對角線上的值y將x是相同的。
要獲得兩條對角線,您需要在左側開始一次使用i,在右側開始一次使用arr.length - i - 1. 隨著i增加,您將逐漸從左向右i移動,同時從右向左移動arr.length - i - 1。
這適用于任何n x n矩陣。
private static void fillDiagonal() {
int[][] arr = new int[5][5];
for (int i = 0; i < arr.length; i ) {
arr[i][i] = 1;
arr[arr.length - i - 1][i] = 1;
}
Arrays.stream(arr).map(Arrays::toString).forEach(System.out::println);
}
預期輸出:
[1, 0, 0, 0, 1]
[0, 1, 0, 1, 0]
[0, 0, 1, 0, 0]
[0, 1, 0, 1, 0]
[1, 0, 0, 0, 1]
uj5u.com熱心網友回復:
它只需要一個回圈,您只需要遍歷邊的一半長度。
int[][] result = fillDiagonal(7);
for (int[] row : result) {
System.out.println(Arrays.toString(row));
}
印刷
[1, 0, 0, 0, 0, 0, 1]
[0, 1, 0, 0, 0, 1, 0]
[0, 0, 1, 0, 1, 0, 0]
[0, 0, 0, 1, 0, 0, 0]
[0, 0, 1, 0, 1, 0, 0]
[0, 1, 0, 0, 0, 1, 0]
[1, 0, 0, 0, 0, 0, 1]
- 取一個
int值來指定方陣的一側 - 回傳填充矩陣
- 給定一個大小為的方陣
n x n - 左上角
v[0][0]和右下角是v[n-i-1][n-i-1]。 - 這些中間值的填充同樣有效地填充從角向內的對角線。
public static int[][] fillDiagonal(int n) {
int[][] v = new int[n][n];
for (int i = 0; i <= n / 2; i ) {
v[i][i] = v[i][n-i -1] = v[n-i-1][i] = v[n-i-1][n-i-1] = 1;
}
return v;
}
uj5u.com熱心網友回復:
首先,請注意您為回圈的每次迭代都設定了這兩個條目,這很糟糕。其次,你有一個雙嵌套回圈,你甚至不使用 j,所以這很糟糕。想一想:您想在主對角線上設定 3 個條目,在反向對角線上設定 3 個條目。所以這應該只需要一個或兩個執行 3 次的回圈,而不是雙嵌套回圈。第三,您意識到重要的索引是 [0][0]、[1][1] 和 [2][2],如果您讓 i 從 0 變為 [i][i],則可以將其索引為2. 現在反向對角線的索引是什么?把它們寫下來,然后根據 i 和 3(或一般的 n)創建一個正確的公式。
uj5u.com熱心網友回復:
private static void fillDiagonal() {
int[][] arr = new int[3][3];
// System.out.println(Arrays.deepToString(arr));
for (int i = 0; i < arr.length; i ) {
for (int j = 0; j < arr[i].length; j ) {
if(i == j) arr[i][j] = 1;
if(i j == arr.length - 1) arr[i][j] = 1;
}
}
System.out.println(Arrays.deepToString(arr));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/449694.html
上一篇:如何有效地抑制excelvba中選定列中的所有空行?
下一篇:使用批處理回圈,直到按下任何鍵
