有一个二维数组 (n*n) ,写程序实现从右上角到左下角沿主对角线方向打印。(注:主对角线方向为从左上角指向右下角这一斜线的方向)
给定一个二位数组 arr 及题目中的参数 n ,请返回结果数组。
数据范围: 
有一个二维数组 (n*n) ,写程序实现从右上角到左下角沿主对角线方向打印。(注:主对角线方向为从左上角指向右下角这一斜线的方向)
[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]],4
[4,3,8,2,7,12,1,6,11,16,5,10,15,9,14,13]
import java.util.*; public class Printer { public int[] arrayPrint(int[][] arr, int n) { int[] ans=new int[n*n]; int idx=0; for(int i=0,j=n-1;j>=0;j--){ int x=i,y=j; while(x<n&&y<n){ ans[idx++]=arr[x++][y++]; } } for(int i=1,j=0;i<n;i++){ int x=i,y=j; while(x<n&&y<n){ ans[idx++]=arr[x++][y++]; } } return ans; } }
import java.util.*; public class Printer { public int[] arrayPrint(int[][] arr, int n) { // write code here int[] ans = new int[n * n]; int i = 0; for(int sy = n - 1; sy > -1; sy--) { int x = 0, y = sy; do { ans[i++] = arr[x++][y++]; } while(y < n); } for(int sx = 1; sx < n; sx++) { int x = sx, y = 0; do { ans[i++] = arr[x++][y++]; } while(x < n); } return ans; } }
public class Printer { public int[] arrayPrint(int[][] arr, int n) { // 1 2 3 4 // 5 6 7 8 // 9 10 11 12 // 13 14 15 16 int row = arr.length; int col = arr[0].length; int[] res = new int[row*col]; int k = 0; //右上半部分 for(int i = col - 1; i >= 0; i--){ int r = 0; int c = i; while(r < row && c < col){ res[k] = arr[r][c]; r++; c++; k++; } } //左下半部分 for(int j = 1; j < row; j++){ int r = j; int c = 0; while(r < row && c < col){ res[k] = arr[r][c]; r++; c++; k++; } } return res; } }
import java.util.*; public class Printer { public int[] arrayPrint(int[][] arr, int n) { // write code here for (int i = 0; i < n; i++) { for (int j = 0; j < n/2; j++) { int temp = arr[i][j]; arr[i][j] = arr[i][n-1-j]; arr[i][n-1-j] = temp; } } ArrayList<ArrayList<Integer>> res = new ArrayList<>(); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { int sum = i+j; if (res.size() == sum) { ArrayList<Integer> list = new ArrayList<>(); list.add(arr[i][j]); res.add(list); } else { ArrayList<Integer> list = res.get(sum); list.add(arr[i][j]); } } } int index = 0; int[] r = new int[n*n]; for (ArrayList<Integer> list: res) { for (int val: list) r[index++] = val; } return r; } }通过率:100%
import java.util.*; public class Printer { public int[] arrayPrint(int[][] arr, int n) { int index = 0;//保存结果数组的下标 int count = 2 * (n - 1) + 1;// 需要遍历的行数 int[] result = new int[n * n];//保存结果的数组 for(int i = 1; i <= n; i ++){ int line = 0; int col = n - i; for(int j = i; j > 0; j--){//每行需要输出的数字个数 //System.out.println(line + " " + col); // System.out.println(arr[line][col]); result[index++] = arr[line][col]; line ++; col ++; } } System.out.println(); for(int i = n + 1; i <= count; i ++){ int line = i - n; int col = 0; for(int j = n - line; j > 0; j--){//每行需要输出的数字个数 //System.out.println(line + " " + col); // System.out.println(arr[line][col]); result[index++] = arr[line][col]; line ++; col ++; } } return result; } }
import java.util.*; public class Printer { public int[] arrayPrint(int[][] arr, int n) { // write code here int[] array = new int[n*n]; int index = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { array[index++] = arr[i][j]; } } int[] ret = new int[n*n]; int[] tmp = new int[n]; int flush = n,count = 2*n-1; for(int i = 0; i < n; i++) { tmp[i] = flush--; } int cur = 1,retI = 0; boolean *** = true; while (count-- > 0) { if(cur <= n && ***) { for (int i = cur-1; i >= 0; i--) { ret[retI++] = array[tmp[i]-1]; if(tmp[i] <= n*n) { tmp[i]+=n; } } if(cur != n) { cur++; }else { cur--; *** = false; } }else { for (int i = n-1; i >= n-cur; i--) { ret[retI++] = array[tmp[i]-1]; if(tmp[i] <= n*n) { tmp[i]+=n; } } cur--; } } return ret; } }看了大佬的题解后,我觉得我就是个铁憨憨。
import java.util.*; public class Printer { public int[] arrayPrint(int[][] arr, int n) { // write code here int[] result = new int[n * n]; int row = 0, col = n - 1, index = 0; while(row < n) { while(row < n && col < n) { result[index++] = arr[row][col]; row++; col++; } if(row < col) { col -= row + 1; row = 0; } else { row -= col - 1; col = 0; } } return result; } }
之前做过一个巧妙的打印方法。 但看到题就是想到最直接的方法 import java.util.*; public class Printer { public int[] arrayPrint(int[][] arr, int n) { // write code here // if(n<1) return -1; //打印上三角包括中间00-nn的对角线 int [] out=new int[n*n]; int index=0; for(int j=n-1;j>=0;j--){ int k=j; for(int i=0;i<n-j;i++){ out[index++]=arr[i][k++]; } } //打印剩下的下三角 for(int i=1;i<n;i++){ int k=i; for(int j=0;j<n-i;j++){ out[index++]=arr[k++][j]; } } return out; } }
// 层次遍历 更容易理解 //根节点入队 孩子入队 根节点出队 直至队列为空 import java.util.*; class Node{ int i; int j; Node(int i,int j){ this.i = i; this.j = j; } } public class Printer { public int[] arrayPrint(int[][] arr, int n) { // write code here Node s = new Node(0,n-1); List<Node> list = new LinkedList<Node>(); list.add(s); int[][] mark = new int[n][n]; int[] result = new int[n*n]; result[0] = arr[0][n-1]; int k =1; while(!list.isEmpty()){ Node temp = list.get(0); list.remove(0); if (mark[temp.i][temp.j] != 0) result[k++] = arr[temp.i][temp.j]; if (temp.j -1 >=0 && mark[temp.i][temp.j-1]==0){ list.add(new Node(temp.i,temp.j-1)); mark[temp.i][temp.j-1]=1; } if (temp.i +1 <n && mark[temp.i+1][temp.j]==0){ list.add(new Node(temp.i+1,temp.j)); mark[temp.i+1][temp.j]=1; } } return result; } }
import java.util.*; public class Printer { public int[] arrayPrint(int[][] arr, int n) { int[] res = new int[n * n]; StringBuilder sb = new StringBuilder(); for (int j = n - 1; j >= 0; j -- ) { for (int i = 0; i < n - j; i ++ ) { sb.append(arr[i][j + i] + ","); } } for (int i = 1; i < n; i ++ ) { for (int j = 0; j < n - i; j ++ ) { sb.append(arr[i + j][j] + ","); } } String[] split = sb.toString().split(","); for (int i = 0; i < split.length; i ++ ) { res[i] = Integer.parseInt(split[i]); } return res; } }
import java.util.*; public class Printer { public int[] arrayPrint(int[][] arr, int n) { // write code here int count = 0; int times = 1; int result[] = new int[n * n]; for (int i = 0; i < n; ++i) { int p = 0; int q = n - 1 - i; for (int x = 0; x < times; ++x) { result[count++] = arr[p][q]; ++p; ++q; } ++times; } times = n - 1; for (int i = 0; i < n - 1; ++i) { int p = i + 1; int q = 0; for (int x = 0; x < times; ++x) { result[count++] = arr[p][q]; ++p; ++q; } --times; } return result; } }