华为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.数据库的查找知道吗
我?查找?
面试官,说一下你知道哪些查找吧
我:快排
面试官很生气,我也不知道咋回事儿,可能太紧张了,越紧张越答错,然后就失去了思考能力…
面试官:我说查找
我:二分查找…(想了半天我也不会其他查找)
面试官:它有个前提条件你知道吗
我:得是有序的
面试官:那你做个题吧
编程:给定一个有序数组,插入一个整数,保持有序
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 。