【经典】华为远程机试题分享(跟进)

在上一篇博客中有说到面试的具体事儿

昨晚那种方法做出来之后,感觉可读性不好,也就是一般情况下很难看懂代码,所以接近睡着时我又想到一个办法比较简单,而且易懂,所以写这篇博客和大家分享一下吧(具体就围绕下图这个核心问题来做

【经典】华为远程机试题分享(跟进)_第1张图片

其实我的想法很简单,就是借助链表来实现,因为链表删除功能方便,直接pollFirst() pollLast();

1、先取出来最上面一排,并移除;

2、取出最又一排并移除;

3、倒叙取出最下面一排并移除;

4、倒叙取出最左面一排并移除;

每次取出来后就删除,当删除一圈后又是一个新的二维;然后直接递归就完事儿了!

(下面粘贴代码)

public static void main(String[] args) {
        
        // 这里模拟一个二维数组
        // ** 这里用链表来存 
        LinkedList> linkedLists = new LinkedList<>();
        LinkedList linkedList = null;
        Integer[][] array = {{1,2,3,4,5,6,7},{8,9,10,11,12,13,14},{15,16,17,18,19,20,21},{22,23,24,25,26,27,28},{29,30,31,32,33,34,35}};
        for (int i = 0; i < array.length; i++) {
            linkedList = new LinkedList<>();
            for (Integer value : array[i]) {
                linkedList.add(value);
            }
            linkedLists.add(linkedList);
        }

        // 打印原来的数据
        System.out.println("打印提供的原数据:" + linkedLists.toString());

        LinkedList resList = new LinkedList();
        printByCycle(linkedLists, resList);
        
        // 打印顺时针获取的数据
        System.out.println("顺时针打印原数据:" + resList);

    }
private static  void  printByCycle(LinkedList> sourceList, List targetList){
        // 从左到右  横向
        LinkedList rmRow = sourceList.pollFirst();
        targetList.addAll(rmRow);
        //从上到下  竖向
        sourceList.forEach((e)->{
            targetList.add(e.pollLast());
            if(e.size()==0){
                sourceList.pollFirst();
            }
        });
        //从右到左  横向
        LinkedList lastLinked = sourceList.pollLast();
        while (lastLinked!=null && lastLinked.size()>0){
            targetList.add(lastLinked.pollLast());
        }
        //从下到上 竖向
        for (int i = sourceList.size() - 1 ; i >=0 ; i--) {
            LinkedList e = sourceList.get(i);
            targetList.add(e.pollFirst());
            if(e.size()==0){
                sourceList.pollLast();
            }
        }
        //递归
        if(sourceList.size()>0){
            printByCycle(sourceList, targetList);
        }
    }

 

  最后结果如下:

【经典】华为远程机试题分享(跟进)_第2张图片

你可能感兴趣的:(Java)