LintCode 185-矩阵的之字型遍历

本人电子系,只为一学生。心喜计算机,小编以怡情。


给你一个包含 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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值