2020.03.16第一次凉面
简历是在join.qq.com上投的。
15号的时候简历被捞起来,通知线上面试。通过点击面试邮件的链接,跳到一个腾讯会议的链接,可以直接进去,但是博主建议还是在电脑上下一个应用的好。需要注意的一个点就是提前把自己的桌面整理一下,不要想我一共享屏幕结果桌面上看到了一堆游戏。这样我觉得会不太好的一个印象。
然后就是正式的面试。
在面试的过程中hr工作态度比较认真,也很有耐心。
上来基本就是围绕简历简单聊了一下,因为我也没有写太多的有关项目,编程方面的。所以也没什么好讲的。再就是问了些是否愿意服从部门的调剂,最久可以实习多久之类的一些问题。
然后就是让我写一个快排,我打开idea准备写,然后hr又要求我用Notepad++去写。ok,就打开Notepad++开始写。写完后,hr很善意的提醒我让我好好检查一下。后来又完善了一下代码。然后hr就开始让我写注释,去解释一下代码。接着就是写了很久的注释。写完后hr让把代码跑起来,跑起来后有bug,后面发现是没有写终止条件。补上终止条件后,还有bug。忽然就懵住了,觉得不可能啊。下附代码:
public class Main {
public static void main(String[] args) {
int[] arr = {6, 9, 8,36,24,12,7,66};
quickSort(0,arr.length - 1,arr);
System.out.println(Arrays.toString(arr));
}
/**
*快速排序:
*思想:分治的思想
*通过记录待排序数组的起始下标和终止下标
*将第一个元素标记为分割的基准
*用i去获取起始的位置 i从前往后走
*j去获取终止的位置 j从后往前走
*在i 与 j没有相遇的前提下
*j先走 去找比基准小的数字 i后走 去找比基准大的数字
*当i j 都找到了后 交换数组i 与j 下标的数字
*若此时i j还未相遇则继续上述过程
*当i j相遇后 此时i左边的数字都小于基准 j右边的数字都大于基准
*此时交换 基准与 i下标的值
*然后在左边和右边的区间中递归上述过程
*递归结束 数组有序
*/
public static void quickSort(int low,int high,int[] arr) {
int i = low, j = high, tmp = arr[low];
if(i > j) {
return;
}
while(i < j) {
while(tmp <= arr[j] && i < j) {
j--;
}
while(tmp >= arr[i] && i < j) {
i++;
}
if(i < j) {
arr[i] = arr[i] + arr[j];
arr[j] = arr[i] - arr[j];
arr[i] = arr[i] - arr[j];
}
}
arr[low] = arr[i];
arr[i] = tmp;
quickSort(low,j - 1,arr);
quickSort(j + 1, arr.length - 1,arr);
}
}
终止条件写的是有问题的。正确的应该是把终止条件放在赋值给i j之前
if(low > high) {
return;
}
当时没能解决这个问题,hr就换了个问题问我。快排为什么快呢?
答:用了分治的思想。
如果这么答的话感觉会好点:快速排序快的主要原因是大大减少了比较和交换的次数,因为按基准数切分的两半数组,在一个数组里面的数据是绝对不会和第二个数组里面的数字产生比较的机会的,所以大幅度降低了做无用功的机会。
后面又问到:分治的思想可以用在哪些方面?
当时也没答上来。
这里上一篇博文的链接吧。
添加链接描述
最后剩下一点时间又问了知道那些数据结构。答的也不是很好。
故凉。
2020.03.31第二次凉面
没想到在过了半个月后,又收到了面试的邀请。
作为一个小白真的很感激可以有第二次机会。
这次主要问了两道智力题。和链表和数组的区别。
第一道题是一个100层高的楼。你有两个玻璃球。已知玻璃球会在某层扔下去摔碎。求玻璃球从哪一层扔下去刚好不会碎。
当时在回答的时候想到肯定需要去分段处理这个问题。但是还是答的不好。
下附一个解答博文的链接
添加链接描述
第二道问了100米的路程,每次走一米或者两米。有多少种走法。
用斐波那契数列的思路来解,但是要用非递归形式来解答。递归形式的话时间复杂度会过高。
正确示范: 注意要用long类型来接收结果
public static void main(String[] args) {
System.out.println(fib(100));
}
private static long fib(int x) {
long a = 1, b = 2;
if(x == 1) {
return a;
}else if(x == 2) {
return b;
}
long sum = 0;
while(x-->2){
sum =a+b;
a=b;
b=sum;
}
return sum;
}
错误操作: 递归
public static void main(String[] args) {
System.out.println(func(100));
}
public static int func(int a) {
if( a <= 0) {
return 0;
}else if(a == 1) {
return 1;
}else if(a == 2) {
return 2;
}
return func(a - 1) + func(a - 2);
}
最后问了数组和链表的区别
也是附一篇博文以供参考。
添加链接描述
希望可以帮助到你。