有一个二维数组 (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) { // write code here int[] A = new int[n*n]; int p = 0; for(int p1=n-1;p1>-1;p1--){ for(int p2=0;p2<n-p1;p2++){ A[p] = arr[p2][p1+p2]; A[n*n-1-p] = arr[n-1-p2][n-1-p1-p2]; p++; } } return A; } }
之前做过一个巧妙的打印方法。 但看到题就是想到最直接的方法 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; } }
class Printer { public: vector<int> arrayPrint(vector<vector<int> > arr, int n) { vector<int> result; for(int i=0;i<n;i++) for(int j=0;j<=i;j++) result.push_back(arr[j][n-1-i+j]); for(int i=1;i<n;i++) for(int j=0;j<n-i;j++) result.push_back(arr[i+j][j]); return result; } };
class Printer { public: vector<int> arrayPrint(vector<vector<int> > arr, int n) { int j=n-1,k=j,i=0; vector<int> a; while(j>=0){ while(j<n) a.push_back(arr[i++][j++]); k--; j=k; i=0; } i=k=1,j=0; while(i<n){ while(i<n) a.push_back(arr[i++][j++]); k++; i=k; j=0; } return a; } }; // class Printer { public: vector<int> arrayPrint(vector<vector<int> > arr, int n) { vector<int> a; int i,j,k; for(j=n-1;j>=0;j--){ i=0,k=j; while(k<n) a.push_back(arr[i++][k++]); } for(i=1;i<n;i++){ j=0,k=i; while(k<n) a.push_back(arr[k++][j++]); } return a; } };
class Printer { public: vector<int> arrayPrint(vector<vector<int> > arr, int n) { // write code here vector <int>ans; for(int j=n-1;j>=0;j--) { int i=0; int m =j; while(m<=n-1) { ans.push_back(arr[i][m]); i++; m++; } } for(int i=1;i<=n-1;i++) { int j=0; int m=i; while(m<=n-1) { ans.push_back(arr[m][j]); m++; j++; } } return ans; } };
class Printer { public: vector<int> arrayPrint(vector<vector<int> > arr, int n) { // write code here vector<int> pri; for(int j=n-1;j>=0;j--) { for(int i=0;i<n-j;i++) { pri.push_back(arr[i][j+i]); } } for(int i=1;i<n;i++) { for(int j=0;j<n-i;j++) { pri.push_back(arr[i+j][j]); } } return pri; } };
/* 题目描述 有一个二维数组(n*n),写程序实现从右上角到左下角沿主对角线方向打印。 给定一个二位数组arr及题目中的参数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] */ class Printer { public: vector<int> arrayPrint(vector<vector<int> > arr, int n) { vector<int> brr; for(int i=0;i<2*n-1;i++){ int x=i<n?0:i-n+1; int y=i<n?n-1-i:0; for(;y<n&&x<n;y++,x++){ brr.push_back(arr[x][y]); } } return brr; } };
import java.util.*; public class Printer { public int[] arrayPrint(int[][] arr, int n) { int [] aa=new int[arr.length*(arr[0].length)]; int cout=0; for(int i=0;i<arr.length+arr[0].length-1;i++){ for(int j=0;j<arr.length;j++){ int x=j+arr[0].length-1-i; if(0<=x&&x<=arr[0].length-1){ aa[cout]=arr[j][x]; cout++; } } } return aa; } }
class Printer { public: vector<int> arrayPrint(vector<vector<int> > arr, int n) { vector<int>a; for(int i=0;i<n;i++) { a.push_back(arr[0][n-1-i]); int y=n-1-i; int x=1; while(y<n-1) { a.push_back(arr[x][y+1]); x++; y++; } } for(int i=1;i<n;i++) { a.push_back(arr[i][0]); int y=0; int x=i+1; while(x<=n-1) { a.push_back(arr[x][y+1]); x++; y++; } } return a; } };
class Printer { public: vector<int> arrayPrint(vector<vector<int> > arr, int n) { vector<int> res; int index1=n-1; int index2=0; while(res.size()<n*n) { int p=index1; int q=index2; while(p<n&&q<n) { res.push_back(arr[q][p]); p++; q++; } if(index1>0) index1--; else { index1=0; index2++; } } return res; } };
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; } }
class Printer { public: vector<int> arrayPrint(vector<vector<int> > arr, int n) { // write code here vector<int>ve; for(int i=n-1;i>=0;i--){ for(int j=i,k=0;j<n&&k<n;j++,k++){ ve.push_back(arr[k][j]); } } for(int i=1;i<n;i++){ for(int j=i,k=0;j<n&&k<n;j++,k++){ ve.push_back(arr[j][k]); } } return ve; } };
vector<int> ans; for(int i=1;i<=n;i++) { for(int j=0;j<i;j++) { ans.push_back(arr[j][n-i+j]); } } for(int i=1;i<n;i++) { for(int j=0;j<=n-1-i;j++) { ans.push_back(arr[i+j][j]); } } vector<int>::iterator iter; for (iter=ans.begin();iter!=ans.end();iter++) { cout<<*iter<<endl; } return ans;
// 层次遍历 更容易理解 //根节点入队 孩子入队 根节点出队 直至队列为空 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) { // 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; } }
vector<int> arrayPrint(vector<vector<int> > arr, int n) { int row = 0; int count = 1; vector<int> result; for(int i = 1;i<=n;i++) { for(int r = 0,c = n-count;r<=i-1,c<n;r++,c++) { result.push_back(arr[r][c]); // cout<<r<<","<<c<<endl; } count ++; } if(n<=1) return result; count = n-1; for(int i =n-1;i>=1;i--) { for(int r = n-count,c = 0;r<=n-1,c<=i-1;c++,r++) result.push_back(arr[r][c]); count --; } return result; }