蛇形打印数组(某宝典公司面试手撕代码题)

背景杂谈

不知道为什么,可能脑袋一下放空了,一不小心就想到了大约2年前,在某个知名的宝典公司面试中,遇到了一道手撕代码题,和多年前的google的那道螺旋遍历数据有异曲同工之妙。现脑洞大开,想写下与大家分享下,解题思路可能不是很正确,欢迎大家建议和指正。

问题描述

有一个数组如下所示,现在需要遍历下,顺序为:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20

126714
3581315
49121619
1011171820

分析:咋一看,和那个螺旋数组挺像的,不过还是有些不一样的

求解思路

如下图所示:首先可以全部一个方向遍历所有的数据,然后把每一组遍历的结果加入list集合中。最后在list集合中,奇偶交错输出所有的数据就可以了。以上思路可能太直白了,应该有最优解,暂时没想到,欢迎大家留言交流。
这里写图片描述

代码示例

     **
     * 蛇形打印数组
     * */
    public static void printSnakeArrays(int [][] array){
        //斜着遍历的每一行的数据集合
        List<ArrayList> list = new ArrayList<>();

        //临时数据
        ArrayList temp;
        int i=0,x,y;
        for(int j=0;j<array[i].length;j++){
            temp=new ArrayList();
            temp.add(array[i][j]);
            x=0;
            y=j;
            while ((x+1<array.length)&&(y-1>=0)){
                temp.add(array[x+1][y-1]);
                x++;
                y--;
            }
            list.add(temp);

            //竖着打印
            if (j==array[i].length-1) {
                for(int k=1;k<array.length;k++){
                    x=k;
                    y=j;
                    temp=new ArrayList();
                    temp.add(array[x][y]);
                    while ((x+1)<array.length&&(y-1>=0)){
                        temp.add(array[x+1][y-1]);
                        x++;
                        y--;
                    }
                    list.add(temp);
                }
            }
        }
        System.out.println("result:");
        int index=0;
        for(int m=0;m<list.size();m++){
            index++;
            if (index%2==0) {
                System.out.println(list.get(m));
            }else {
                Collections.reverse(list.get(m));
                System.out.println(list.get(m));
            }
        }
    }

运行结果

[1]
[2, 3]
[4, 5, 6]
[7, 8, 9, 10]
[11, 12, 13, 14]
[15, 16, 17]
[18, 19]
[20]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值