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