首页 > 试题广场 >

之字形打印矩阵

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

对于一个矩阵,请设计一个算法,将元素按“之”字形打印。具体见样例。

给定一个整数矩阵mat,以及他的维数nxm,请返回一个数组,其中元素依次为打印的数字。

测试样例:
[[1,2,3],[4,5,6],[7,8,9],[10,11,12]],4,3
返回:[1,2,3,6,5,4,7,8,9,12,11,10]
 public int[] printMatrix(int[][] mat, int n, int m) {
     int[] arr = new int [n*m];
     //hang记录你的行数,count记录的是你返回的字符数组的长度
      int hang = 0;
      int count = 0;
        //偶数行顺序,奇数行倒序
        for(int i = 0; i < mat.length; i++ ){
            for(int j = 0; j < mat[i].length; j++){
                //判断数奇数行还是偶数行
                if(hang%2 == 0){
                    arr[count++] = mat[i][j];
                }else{
                    arr[count++] = mat[i][m-1-j];
                }
            }
            //写完了一行,行数需要+1
            hang++;
        }
        return arr;
    }

编辑于 2016-03-29 13:42:57 回复(3)

python solution:

class Printer:
    def printMatrix(self, mat, n, m):
        res=[]
        for i,v in enumerate(mat):
            if i%2 == 0:
                res+=v
            else:res+=v[::-1]
        return res
发表于 2017-09-12 11:50:54 回复(0)
importjava.util.*;
 
publicclassPrinter {
    publicint[] printMatrix(int[][] mat, intn, intm) {
        int[] ans = newint[m*n];
        intflag=0;
        for(inti=0;i<n;i++){
            for(intj=0;j<m;j++){
                ans[flag++] = mat[i][Math.abs((i&1)*(m-1)-j)];
            }
        }
        returnans;
    }
}

发表于 2016-05-24 19:30:55 回复(2)
L0L头像 L0L
class Printer {
public:
    vector<int> printMatrix(vector<vector<int> > mat, int n, int m) {
        vector<int> ret;
        for(int i=0;i<n;i++)
            if(i%2!=0)
                reverse(mat[i].begin(),mat[i].end());
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            	ret.push_back(mat[i][j]);
        return ret;
    }
};

发表于 2015-09-11 17:37:29 回复(1)
class Printer {
public:
    vector<int> printMatrix(vector<vector<int> > mat, int n, int m) {
        vector<int> result;
        for(int i=0;i<n;i++)
        {
            if(i&1)
                for(int j=m-1;j>=0;j--)
                    result.push_back(mat[i][j]);
            else
                for(int j=0;j<m;j++)
                    result.push_back(mat[i][j]);         }         return result;
    }
};

发表于 2017-10-18 00:41:16 回复(0)
import java.util.*;

public class Printer {
    public int[] printMatrix(int[][] mat, int n, int m) {
        // write code here
        int[] temp = new int[n*m];
        int count = 0;
        for(int i=1;i<=n;i++){
            if(i%2 !=0){
                for(int j=1;j<=m;j++){
                    temp[count]=mat[i-1][j-1];
                    count++;
                }
            }else{
                for(int j=m;j>=1;j--){
                    temp[count]=mat[i-1][j-1];
                    count++;
                }
            }
        }
        return temp;
    }
}
行是奇数时从左到右,行为偶数时从右到左 

发表于 2016-03-02 15:30:59 回复(1)
import java.util.*;

public class Printer {
    public int[] printMatrix(int[][] mat, int n, int m) {
        // write code here
        int a = 0;
        int b = 0;
        int[] c = new int[n*m];
        int d = 0;
        while(a < n && d < n*m){
            if(a % 2 == 0){
                for(int i = b ; i < m ; i++){
                    c[d++] = mat[a][i];
                    b = m - 1;
                }
            }
            else{
                for(int j = b ; j >= 0 ; j--){
                    c[d++] = mat[a][j];
                    b = 0;
                }
            }
            a++;
        }
        return c;
    }
}

发表于 2018-08-26 14:26:31 回复(0)
class Printer {
public:
    vector<int> printMatrix(vector<vector<int> > mat, int n, int m) {
        vector<int> p(m*n);
        for(int i=0; i<m*n; i++)
           p[(i/m)%2==0? i:(i/m+1)*m-i%m-1]=mat[i/m][i%m];
        return p;
    }
};
提升了代码整洁度和减少代码
感觉牺牲了一点运行时间:有时候是0ms   有时候是10ms不懂
占用内存:8552k        
发表于 2016-04-19 12:40:25 回复(0)
这个就是一个奇数行正显偶数行倒显的问题,方法很笨,但很直接,暴力求解
import java.util.*;

public class Printer {
    public int[] printMatrix(int[][] mat, int n, int m) {
        int[] temp = new int[n*m];//用来存储最后输出数组数据
        int cont = 0;
        for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
                                //下标加一用来判断逻辑上的奇偶行:1为奇数行,0为偶数行
                if((i+1)%2!=0){
                    temp[cont] = mat[i][j];
                    cont++;   
                }else{
                    temp[cont] = mat[i][m-1-j];
                    cont++;
                }
			}
        }
        return temp;
 }
}


发表于 2020-05-12 10:52:25 回复(0)
class Printer {
public:
    vector<int> printMatrix(vector<vector<int> > mat, int n, int m) {
        // write code here
        vector<int> res;
        bool flag = true;
        for (int i=0; i<n; i++)
        {
            if (flag)
            {
                for (int j=0; j<m; j++) res.push_back(mat[i][j]);
                flag = !flag;
            }
            else 
            {
                for (int j=m-1; j>=0; j--) res.push_back(mat[i][j]);
                flag = !flag;
            }
        }
        return res;
    }
};

发表于 2019-10-15 23:40:06 回复(0)
import java.util.*;

public class Printer {
    public int[] printMatrix(int[][] mat, int n, int m) {
        // write code here、
        int[] result=new int[m*n];
        int index=0;
        for(int i=0;i<n;i++){
            if(i%2==0){
                for(int j=0;j<m;j++)
                    result[index++]=mat[i][j];
            }else{
                for(int j=m-1;j>=0;j--)
                    result[index++]=mat[i][j];
            }
        }
        return result;
    }
}

发表于 2018-10-17 23:24:06 回复(0)
class Printer:
    def printMatrix(self, mat, n, m):
        result = []
        for i in range(n):
            if i & 1:
                result += mat[i][::-1]
            else:
                result += mat[i][:]
        return result
        # write code here
编辑于 2018-10-14 20:41:18 回复(0)
import java.util.*;

public class Printer {
    public int[] printMatrix(int[][] mat, int n, int m) {
        // write code here
        int[] res = new int[n*m];
        int k = 0;
        for(int i = 0;i < n;i++){
            if((i & 1) == 0){
                for(int j = 0; j < m;j++){
                    res[k++] = mat[i][j];
                }
            }else{
                for(int j = m - 1;j >= 0;j--){
                    res[k++] = mat[i][j];
                }
            }
        }
        return res;
    }
}

发表于 2018-03-06 23:48:12 回复(0)
import java.util.*;

public class Printer {
    public int[] printMatrix(int[][] mat, int n, int m) {
        int result[] = new int[n*m];
		int count = 0;
		for(int i=0;i<n;i++){
			
			for(int j=0;j<m;j++){
				int tmpj = (i%2)==0?j:m-1-j;
				result[count++] = mat[i][tmpj];
			}
		}
		return result;
    }
}

发表于 2017-05-19 11:21:23 回复(0)
class Printer: def printMatrix(self, mat, n, m):
        ans = []  for i in range(n):  if i % 2 == 0:
                ans += mat[i]  else:
                ans += mat[i][::-1]  return ans

编辑于 2017-05-09 21:34:01 回复(0)
	/**
	 * 之字遍历
	 * @param mat
	 * @param n
	 * @param m
	 * @return
	 */
	public static int[] printMatrix(int[][] mat, int n, int m) {

		int flag = 0;
		int k = 0;
		int[] res = new int[n*m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				res[k++] = flag == 0 ? mat[i][j] : mat[i][m-1-j];
			}
			flag = 1 - flag; // 切换
		}
		return res;
	}


编辑于 2017-04-05 22:53:58 回复(0)

classPrinter {
public:
    vector<int> printMatrix(vector<vector<int> > mat, intn, intm) {
        // write code here
        vector<int> matrix;
        inti,j;
        for(i=0;i<n;i++){
            if(i%2==0){
                for(j=0;j<m;j++){
                    matrix.push_back(mat[i][j]);
                }
            }
            else{
                for(j=m-1;j>=0;j--){
                    matrix.push_back(mat[i][j]);
                }
            }
        }
        returnmatrix;
    }
};

发表于 2017-01-15 16:56:16 回复(0)
import java.util.*;

public class Printer {

    public int[] printMatrix(int[][] mat, int n, int m) {

        // write code here

        int[] result = new int[n*m];

        for (int i=0;i<n*m;i++){

            if ((i/m)%2 == 0)

                result[i] = mat[i/m][i%m];

            else

                result[i] = mat[i/m][m-i%m-1];

        }

        return result;

    }

}

编辑于 2016-12-29 03:37:16 回复(0)
import java.util.*;
public class Printer {
   public int[] printMatrix(int[][] mat, int n, int m) {
		List<Integer> list = new ArrayList<>();
		for (int i = 0; i < mat.length; i ++ ) {
			if(i % 2 == 0) for (int j = 0; j < m; j ++ )
				list.add(mat[i][j]);
			else for (int j = m - 1; j >= 0; j -- )
				list.add(mat[i][j]);
		}
		int[] res = new int[n * m];
		for (int i = 0; i < res.length; i ++ ) 
			res[i] = list.get(i);
		return res;
	}
}

发表于 2016-10-18 09:39:57 回复(0)
class Printer {
public:
    vector<int> printMatrix(vector<vector<int> > mat, int n, int m) {
        // write code here
        vector<int>ans;
        int dir = 1;
        
        for(int i=0;i<n;i++)
            {
            if(dir>0)
                {
                for(int j=0;j<m;j++)ans.push_back(mat[i][j]);
            }
            else
                {
                for(int j=m-1;j>=0;j--)ans.push_back(mat[i][j]);
            }
            dir = -1 * dir;
        }
        return ans;
    }
};

发表于 2016-09-01 20:26:25 回复(0)