有一个二维数组 (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;
}
}