本人电子系,只为一学生。心喜计算机,小编以怡情。
给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历。
您在真实的面试中是否遇到过这个题? Yes
样例
对于如下矩阵:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10, 11, 12]
]
返回 [1, 2, 5, 9, 6, 3, 4, 7, 10, 11, 8, 12]
最近学了verilog状态机,想到了这题可以用有限状态机来写,于是就简化了很多思考过程。
static public int[] printZMatrix(int[][] num)
{
ArrayList<Integer> ret =new ArrayList<>();
int state=0;
int i=0;//下标
int j=0;
int hang=num.length;
int lie=num[0].length;
final int RIGHTUP=1;//定义两个方向
final int LEFTDOWM=0;
boolean con=true;//控制退出
int flag=0;//方向控制
while(con){
int number=0;
if(!(i+1==hang&&j==lie))
if(!(i==hang&&j+1==lie))
number=num[i][j];//取数
switch (state)
{
case 0:{//第一步决定方向
ret.add(number);
if(lie!=1)
state=1;
else
state=3;
}break;
case 1:{//右移一位
j++;
if(flag==LEFTDOWM)
state=2;
if(flag==RIGHTUP)
state=4;
if(i+1==hang&&j==lie)
state=Integer.MAX_VALUE;//进入default,随便设了一个数
}break;
case 2:{//往左下角运作
ret.add(number);
i++;
j--;
state=2;
if(j==-1&&i<hang)
{
state=3;
i--;
j++;
flag=RIGHTUP;
}
if(i>=hang)
{
state=1;
i--;
j++;
flag=RIGHTUP;
}
}break;
case 3:{//下移一位
i++;
if(flag==LEFTDOWM)
state=2;
if(flag==RIGHTUP)
state=4;
if(i==hang&&j+1==lie)
state=Integer.MAX_VALUE;
}break;
case 4:{//向右上角运作
ret.add(number);
j++;
i--;
if(i==-1&&j<lie)
{
state=1;
i++;
j--;
flag=LEFTDOWM;
}
if(j>=lie)
{
state=3;
i++;
j--;
flag=LEFTDOWM;
}
}break;
default://最后的退出循环
con=false;
break;
}
}
int newret[]=new int[ret.size()];
for(i=0;i<ret.size();i++){
newret[i]=ret.get(i);
}
return newret;
}