北漂第“二”周
面试X肚X,依然失败了QAQ
Everything that kills ME makes me feel ALIVE
去了X肚X刚开始等了一会,差不多快十点的时候员工们一个个才开始上班。Emmm……怎么讲,上午十点准时上班貌似是一个很大的亮点,装修装饰也很符合APP里面少女心爆棚的那种感觉,可能和办公室的年龄有关这里面的氛围很活泛。
去了笔试是在一个Mac上,直接IDAE走起,幸好之前在电脑上安装过破解版的IDAE所以一些基本的功能还会一些,但是用起来那个不顺手啊,真是让人难过。?
笔试题一共有三个,都是同一系列问题,回来之后在网上搜了一下,应该属于偏原创的算法题,在这里由于技术问题还是不献丑了,题意大概如下:
第一题说有男生女生去吃饭,要求给他们四个人一组,按照男女比例平衡的情况下随机分组,当时对于我来说的思路就是做一个类似于Collections中的shuffle方法,这个而不算难,成功了!
第二题很难受,还是上面的条件,分两次组,第二次要任意两个人都没有在第一次一个组过,这个我真的是~!@#$%^&*,怎么会有这种事情呢?让他们好好按照自己的意思吃饭不好吗,培养一下感情不好吗,纠结了良久之后选择了一个思路,按照S行读取的方法将他们转置,但是这样话如果只是测试数据男女8人的话可以,多了就肯定会出现重复了?至今也没有找到一个可以解决的办法,真是难过
第三题更难受,要在K次之内保证他们两两不相遇,真的是难,也有可能是我得脑子不够灵光
最后来一个小哥,我跟他讲明了之后他继续给我面技术,然后。。问了快排???!!!
那个时候的感觉就是。。数据结构和算法真香!
在这里整理一下快排吧
快排
从网上找到一个很形象的GIF
快排的大体流程就是
- 设定一个分界值,通过该分界值将数组分成左右两部分
- 将大于或者等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边
- 此时,左边部分中各元素都小于或等于分界值,而右边部分中个元素都大于或等于分界值
- 左边和右边的数据可以独立排序,对于左侧的数据,又可以取一个分界值,将该部分数据分成左右两部分,同样左边放小的,右边放大的,右侧数据类似处理
- 重复上述过程进行递归操作
public class Main {
public static int[] qsort(int arr[],int start,int end) {
int key = arr[start];
int i = start;
int j = end;
while(i<j) {
while((i<j)&&(arr[j]>key)) {
j--;
}
while((i<j)&&(arr[i]<key)) {
i++;
}
if((arr[i]==arr[j])&&(i<j)) {
i++;
}else {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
if(i-1>start) {
arr = qsort(arr,start,i-1);
}
if(j+1<end) {
arr = qsort(arr,j+1,end);
}
return arr;
}
public static void main(String[] args) {
System.out.println("初始的顺序:");
int[] arr = {3,3,4,5,32,1,22,44,21};
for (int i : arr) {
System.out.print(i+"\t");
}
int len = arr.length-1;
arr = qsort(arr,0,len);
System.out.println();
System.out.println("最后的顺序:");
for (int i : arr) {
System.out.print(i+"\t");
}
}
}
输出的结果:
初始的顺序:
3 3 4 5 32 1 22 44 21
最后的顺序:
1 3 3 4 5 21 22 32 44
关于快排的性能:
快排的一次划分从两头开始到start和end重合时间复杂度是O(n)
最理想的情况下就是每次划分所选择的中间数恰好将当前序列几乎等分,经过log2n趟划分,得到长度为1的子表,这样整个的时间复杂度是O(nlog2n)
最坏的情况下就是每次所选的中间数是最大或者最小的数,每次划分子表都要一个全表,子表的长度为原来的长度-1,这样长度为n的数据需要划分n趟,整个的时间复杂度是O(n2)
面试的时候如果回答上这个来估计会有很多加分吧,虽然只是最基础的快排,但是足以展现算法的功底比较扎实。
另外今天面试了安X公司
面试的小姐姐态度真的超级好,很有礼貌的那种,聊的也很开心,耐心等结果ing
好啦,废话不多说,今天面的题目难度不算大,甚至应该算是很基础了
前面的题都是逻辑思维题,只要你带上演算纸应该没什么问题
后面三道编程题手撕代码很爽
二分查找
这个应该是很久以前的东西了,所以完全忘得干干净净,只好在现场慢慢的琢磨
public class Main {
public static int query(int arr[],int key,int left,int right) {
if(key<arr[left] || key>arr[right] || left>right) {
return -1;
}
int middle = (left+right)/2;
if(arr[middle]<key) {
return query(arr,key,middle+1,right);
}else if(arr[middle]>key) {
return query(arr,key,left,middle-1);
}else {
return middle;
}
}
public static void main(String[] args) {
System.out.println("arr数组:");
int[] arr = {1,2,3,4,5,6,7};
System.out.println(query(arr,7,0,arr.length-1));
}
}
结果:arr数组:6
二分查找的最坏时间复杂度为O(log2n)
剩下的面试题就是打印一个99乘法表和一个SQL语句的编写,SQL有点难度,但是不外乎建表,增删改,单表查,多表查
希望会有结果吧,今天回头一看,数据结构与算法真香,加油啊小伙子