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

本文介绍了一种使用链表数据结构实现二维数组顺时针打印的方法,通过四个步骤:取出并移除最上排、最右排、最下排(倒序)、最左排(倒序),并递归处理剩余部分,实现了简洁且易懂的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

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

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

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

(下面粘贴代码)

public static void main(String[] args) {
        
        // 这里模拟一个二维数组
        // ** 这里用链表来存 
        LinkedList<LinkedList<Integer>> linkedLists = new LinkedList<>();
        LinkedList<Integer> 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<Integer>();
        printByCycle(linkedLists, resList);
        
        // 打印顺时针获取的数据
        System.out.println("顺时针打印原数据:" + resList);

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

 

  最后结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值