首页 > 试题广场 >

二维数组打印

[编程题]二维数组打印
  • 热度指数:11191 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

有一个二维数组 (n*n) ,写程序实现从右上角到左下角沿主对角线方向打印。(注:主对角线方向为从左上角指向右下角这一斜线的方向)

给定一个二位数组 arr 及题目中的参数 n ,请返回结果数组。

数据范围:

示例1

输入

[[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;
    }
}

发表于 2023-09-05 22:22:22 回复(0)
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;
    }
}

发表于 2022-05-19 20:45:50 回复(0)
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;
    }
}

发表于 2021-02-16 21:44:16 回复(0)
超级麻烦的萌新做法
1.因为从左上到右下打印的话是有规律的,就是副的斜对角线的i+j的和是一样的,
0 1 2 3
1 2 3 4
2 3 4 5
3 4 5 6
所以首先先对矩阵进行翻转,就可以进行利用和相同的规律做了。
2.利用ArrayList按顺序进行加入,然后生成最终的矩阵即可。
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%
运行时间:2274ms没上榜
占用内存:45200KB
溜了溜了去研究别人写的代码去了

发表于 2020-12-23 14:45:11 回复(0)
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;
    }
}

发表于 2020-04-30 12:34:44 回复(0)
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;
    }
}
看了大佬的题解后,我觉得我就是个铁憨憨。
发表于 2020-04-16 00:24:15 回复(0)
每一个带箭头的数字,都是每一列对角线的入口,用两个变量记录这个位置,这个位置从右上角开始,先从右到左,再从下向下移动
代码如下:
public static int[] arrayPrint(int[][] arr, int n) {
        // write code here
        int a[] = new int [n*n];
        int index=0;//a[] 的当前下标
        // i 和 j 记录每一对对角线的入口(起始)
        int i=0;//行
        int j=n-1;//列
        while(i!=n || j!=0){//左下角最后一个元素之后结束
            int t1=i;
            int t2=j;
            while(t1<n&&t2<n){
                a[index++]=arr[t1++][t2++];
            }
            // 改变 i, j 为下一组对角线的入口
            if(i==0&&j==0)
                i++;
            else if(i==0)
                j--;
            else
                i++;
        }
        return a;
    }

发表于 2018-08-19 16:44:48 回复(0)
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;
    }
}

发表于 2017-05-09 22:29:13 回复(0)
之前做过一个巧妙的打印方法。
但看到题就是想到最直接的方法
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;
    }
}

编辑于 2017-05-01 13:17:12 回复(1)
import java.util.*;
public class Printer {
    public int[] arrayPrint(int[][] arr, int n) {
        int[] res=new int[n*n];
        int a=0;
            for(int i=n-1;i>=0;i--){
               int p=0;
               for(int j=i;j<n;j++){
                   res[a]=arr[p][j];
                   a++;
                   p++;
               }
            }
        for(int i=1;i<n;i++){
            int p=0;
            for(int j=i;j<n;j++){
              res[a]=arr[j][p];
                a++;
                p++;
            }
        }
        return res;
    }
}
发表于 2017-03-13 10:19:23 回复(0)
// 层次遍历 更容易理解
//根节点入队  孩子入队 根节点出队 直至队列为空
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;
    }
}

编辑于 2016-09-09 16:55:14 回复(0)
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;
    }
}

发表于 2016-09-04 01:35:46 回复(0)
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;
    }
}

发表于 2016-09-02 16:13:49 回复(0)
public int[] arrayPrint(int[][] arr, int n) {
// write code here
int len=n*n;
int []result=new int [len];
int startx=0;
int starty=n-1;
int x=startx;
int y=starty;
for(int i=0;i<len;++i){
     if (x<n&&y<n) {
       result[i]=arr[x][y];
    }
    if (y==n-1||x==n-1) {
          if (starty!=0) {
            starty-=1;
            }
          else {
            startx+=1;
          }
       x=startx;
       y=starty;
   }
   else {
        x+=1;
       y+=1;
   }
}
return result;
}
编辑于 2016-08-16 21:43:15 回复(0)