华为Java开发一面二面(OD)4.3

面试的是1-3年工作经验的岗位
 

一面:45min

    主要是问项目和平时用到的一些工具之类的,因为我写的比较少,所以基本上都是问的springboot和spring的内容。

1.AOP
2.mapper的映射
3.封装、多态的理解
4.四次挥手
…想不起来了
编程:给一个数组,包含一组温度,求:每一天对应的升温天数,如果没有则为0,返回一个数组;
例:[54,57,34,2,15] ----> [1,0,0,1,0]

(用了最笨的方法,再想想还有没有其他方法)

package com.example.demo;

/**
 * @Description
 *
 * 过多久升温
 *
 * @Author Radish
 * @Date 2020/4/3
 */
public class Temp {
    public static void main(String[] args) {
        int[] days = getDays(new int[]{1, 15, 30, 2, 7});
        for (int i : days) {
            System.out.print(i + ", ");
        }
    }
    public static int[] getDays(int[] temps) {
        int[] days = new int[temps.length];
        //过几天温度会升高
        for (int i = 0; i < temps.length; i++) {
            days[i] = 0;
            for (int j = i+1; j < temps.length; j++) {
                if (temps[j]>temps[i]) {
                    days[i] = j-i;
                    break;
                }
            }
        }
        return days;
    }
}

  本来以为面完一个要等很久才能进下一面,没想到二面马上就来了…

  由于是视频面试,第一个面试官说了再见我就下线了,结果hr又叫我上去…没有做好心理准备,然后我开始自我介绍的时候,天猫精灵开始报时,我就被打断了,然后刚想去关,它就停了,然后我跟面试官解释了一下,好像面试官不太开心(哎,换我我也不开心,下次要先把天猫精灵给静音!),接下来的面试过程就不是很顺利了…

二面:20min

1.IOC

把我理解的说了,但是面试官似乎不太满意?啊!我没有说是通过反射实现的!

2.说一下集合

(我把map给带上了,然后忽然想到map不是集合,然后又说set和list),面试官还想要queue,我给漏了。然后在讲hashSet的时候又扯到HashMap上去了…面试官很不开心…然后让我讲了讲ArrayList和LinkedList。

3.堆栈

(只说了垃圾回收主要是在堆上进行的,想了半天没想起来其他的,面试官听到前半句的时候有点开心,然后他又不开心了…)

4.线程池

(记得不太清楚,源码也没有看完,只了解个大概,面试官说你把最重要的给漏了,队列,我说,它是个阻塞队列,面试官说,它是阻塞的?队列是要你传给它的,我傻了吧唧的:它默认是个阻塞队列。它真的是个阻塞队列吗!!!你为何要如此执着???)

5.创建线程

嘤嘤嘤,终于完整并且条理清晰地回答出一个问题了…面试官唯一一个比较满意的答案o(╥﹏╥)o

6.重载、重写的理解

大概也许还行吧,毕竟没难度…

7.REST

我们项目没有用这种,所以略过了

8.long是由几位字节组成的,在不同的系统和不同的平台上有什么区别,为什么

8位,在哪儿都是8位,因为…(一次编译到处执行,我要怎么解释出来)它在每一个平台上都有对应的编译器,就是会给它编译成一样的

9.数据库的查找知道吗

我?查找?

面试官,说一下你知道哪些查找吧

我:快排

荣耀rta Java对接优化方案 荣耀java开发_转义


面试官很生气,我也不知道咋回事儿,可能太紧张了,越紧张越答错,然后就失去了思考能力…

面试官:我说查找

我:二分查找…(想了半天我也不会其他查找)

面试官:它有个前提条件你知道吗

我:得是有序的

面试官:那你做个题吧

编程:给定一个有序数组,插入一个整数,保持有序
package com.example.demo;

/**
 * @Description
 * @Author Radish
 * @Date 2020/4/3
 */

public class InsertNum {
    public static void main(String[] args) {
        int[] ints = insertNum(new int[]{1, 2, 3, 4, 5, 6}, 6);
        for (int i : ints) {
            System.out.print(i + ", ");
        }
    }
    public static int[] insertNum(int[] nums, int n) {
        //数组插入一个新的数
        int[] result = new int[nums.length + 1];
        int index = getIndex(nums, 0, nums.length - 1, n);
        int i = 0;
        for (; i < index; i++) {
            result[i] = nums[i];
        }
        result[i++] = n;
        for (; i <= nums.length; i++) {
            result[i] = nums[i-1];
        }
        return result;
    }
    
    public static int getIndex(int[] nums, int l, int r,int n) {
        if (l >= nums.length || r < 0) {
            return 0;
        }
        if (l == r) {
            return l;
        }
        int midIndex = (l+r)/2;
        int mid = nums[midIndex];
        //n在该值左侧
        if (mid> n) {
            return getIndex(nums,l,midIndex-1,n);
        }
        if (mid < n) {
            //n在该值右侧
            return getIndex(nums,midIndex+1,r,n);
        }
        return midIndex;
    }
}

总结:

  问的都不难,如果心态平和一点应该会比现在答得好(至少带上脑子)。下次面试一定要确保手机、天猫精灵都静音了!不要怕,冷静,人家又不会吃了你,不会就不会呗,不会就接着学啊。不要自乱阵脚。
好了,我要去哭一会儿…
 

笔试3.16

啊顺便说一下笔试吧
笔试是在牛客上做的,每场两个编程题,只要做出一个并且调试通过率达到80%就算过。可以跳出浏览器在本机编辑。
考试的时候,要求手机保持在一个监控页面,一旦点了别的就会退出,规则好像是退出3次就算作弊?

事实证明还有人工审核,所以,调试有问题的话不要担心,把逻辑写对就行。

做了华为的两套笔试题。
   第一场,第一题死活调不出来…我觉得代码一点毛病都没有!我试了好多种Scanner获取输入的方法都没有用,最后放弃了。由于太紧张,第二个题目看错了,写完了发现,哎!题目不是这样的啊!还有10分钟了,赶紧重新整理了思路,除了没有写怎样获取最大公约数,其他的逻辑都完成了。调试只过了20%,当时心想应该凉了。不过还是比较满意的,因为我感觉解题思路对了(虽然方法比较笨)。

   然后我给我家人打了个电话想被鼓励一下,没人接?然后我决定一鼓作气把第二套题目给做了。

   结果刚开始,手机就一直发消息(我前几天才把微信音量开开,我妈说我老是失踪,我才发现原来微信的声音还要在设置那里打开才行),过了一会儿又变成一直打电话…我哭了…它一直吵,我决定把音量关掉,结果一点,监控页面没了…我就炸了,接下来就很不顺利了。

笔试题目1

输入数字序列,验证是否符合规则

  • 一位数和二位数交替出现
  • 头尾为一位数,中间为二位数
  • 头尾为二位数,中间为一位数
    用例直接输入一段数字,每一行代表一组
    (我的代码输出第一个结果老是挨着输入,因为测试用例输入完成后应该没有换行,跟标准结果的行数不对,但是我尝试了在接收到输入后换行还有在打印结果前换行都不行,折腾了好久都不行我就放弃了)
package com.example.demo.test;

import java.util.Scanner;

/**
* @Description
* 输入数字序列,验证是否符合规则
* 规则:
* 1.一位数和二位数交替出现
* 2.头尾为一位数,中间为二位数
* 3.头尾为二位数,中间为一位数
* @Author Radish
* @Date 2020/3/16
*/

public class FirstQ {
   public static void main(String[] args) {
       Scanner in = new Scanner(System.in);
       while (in.hasNext()) {
           String str = in.nextLine();
           if (str.length()<1) continue;
           String[] strs = str.split(" ");
           //如果只有一个或0个,为true
           if (strs.length < 1) continue;
           if (strs.length<2) {
               System.out.print(true + " ");
               continue;
           }
           boolean right = false;

           boolean flag = true;
           //数字个数>=2
           int length0 = strs[0].length();
           int length1 = strs[1].length();
           int lengthLast = strs[strs.length-1].length();
           if (length0 != length1 && length0 != lengthLast) {
               //只能是交替
               for (int i = 0; i < strs.length; i+=2) {
                   if (strs[i].length() != length0) {
                       flag = false;
                   }
               }
               for (int i = 1; i < strs.length; i+=2) {
                   if (strs[i].length() != length1) {
                       flag = false;
                   }
               }
               if (flag) right = true;
           }
           if (length0 == lengthLast){
               //情况2或3,中间的长度不能等于头尾
               for (int i = 1; i < strs.length-1; i++) {
                   if (strs[i].length() == length0) {
                       flag = false;
                   }
               }
               if (flag) right = true;
           }
           System.out.print(right + " ");
       }

   }
}

笔试题目2

给定范围[N,M],求该范围内所有勾股数元组[a,b,c]。
勾股数元祖:三个数两两互质的勾股数。例如:[3,4,5]

package com.example.demo;

import java.util.*;

/**
 * @Description
 * 给定范围[N,M]所有勾股数元组
 * @Author Radish
 * @Date 2020/3/16
 */

public class Gougu {
    public static void main(String[] args) {
        //a2 + b2 = c2
        //a,b为质数,下一个质数是否符合
        //先求出质数
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int n = in.nextInt();
            int m = in.nextInt();
            /*TreeSet<Integer> set = new TreeSet<>();
            for (int i = n; i < m; i++) {
                //求质数?
                set.add(i);
                //是否有约数
                for (int j = 2; j <= i/2; j++) {
                    if (i%2==0) {
                        set.remove(i);
                        break;
                    }
                }
            }*/
            ArrayList<Integer> list = new ArrayList<>();
            for (int i = n; i < m; i++) {
                list.add(i);
            }
            //取三个值看是否符合勾股定理,俩较小的数和一个较大的数,当较大的数平方大于左值时,较大数取小一个
            ArrayList<Integer> result = new ArrayList<>();
            for (int i = 0; i<list.size();i++) {
                for (int j = i+1; j < list.size();j++) {
                    for (int k = j+1; k < list.size();k++) {
                        int a = list.get(i);
                        int b = list.get(j);
                        int c = list.get(k);
                        int left = a*a + b*b;
                        int right = c*c;
                        if (left == right && valid(a,b,c)) {
                            //是否互质
                            result.add(a);
                            result.add(b);
                            result.add(c);
                        }
                        if (right>left) break;
                    }
                }
            }

            for (int i = 0; i < result.size();i++) {
                System.out.print(result.get(i)+ " ");
                if ((i+1)%3==0) {
                    System.out.println();
                }
            }
        }
    }

    public static boolean valid(int a,int b,int c) {
        //ab,ac,bc
        return valid(a,b)&&valid(a,c)&&valid(b,c);
    }

    public static boolean valid(int a,int b) {
        for (int i = 2; i <= (a>b?b:a);i++) {
            if (a%i==0 && b%i==0) {
                return false;
            }
        }
        return true;
    }
}

笔试题目3

报文转义功能

  • 报文中如果出现0x0A,转义成两个字节0x12 0x34,如果出现0x0B,转义成两个字节0xAB,0xCD,其他报文保持不变
  • 输出的第一个字节为报文长度(包含它自己)
  • 就是如果输入A就转义成12 34,如果输入B就转义成AB CD

笔试题目4

磁盘容量从大到小排序,nm,n为数字:1-1000,m为单位:M、G、T 。