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

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

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

其实我的想法很简单,就是借助链表来实现,因为链表删除功能方便,直接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);
        }
    }

 

  最后结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华为OD试题是一个测试C语言编程能力的考题。考试内容通常包括C语言的基本语法、数据类型、运算符、流程控制、函数、数组、指针等知识点。下面是一个用300字回答华为OD试题的例子: 华为OD试题是华为公司的一种面试方式,用来测试应聘者的C语言编程能力。这个试题主要考察了C语言的基本语法、数据类型、运算符、流程控制、函数、数组、指针等知识点。平常我们在大学学习C语言的时候会接触到这些知识点,只要复习一下就能应对这样的考试。 回答这个试题需要我们对C语言的各个知识点都有一定的了解。比如,我们需要知道C语言中的基本数据类型有哪些,如int、float、char等,以及它们的取值范围和计算规则;我们还需要了解C语言中的运算符,如算术运算符、关系运算符、逻辑运算符等,以及它们的优先级和结合性;我们还需要掌握C语言的流程控制结构,如if语句、for循环、while循环等,以及它们的用法和注意点。 在试题中,可能会出现一些需要编写C语言程序的题目,这就需要我们熟悉C语言的编程语法和语句。比如,题目可能会要求我们编写一个函数,完成某个功能;或者题目可能会给出一段代码,让我们分析其输出结果。这些编程题目都是为了检验我们对C语言的掌握程度和编程能力。 总而言之,华为OD试题是一种考察C语言编程能力的方式。只要我们对C语言的基本语法、数据类型、运算符、流程控制、函数、数组、指针等知识点有一定的掌握,就能够应对这样的考试。通过反复练习和复习,我们就能在华为OD试中取得好成绩。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值