那么N个呢?递归的话容易实现,但不一定是最好的,如果每个数组一个指针会不会空间太大呢?只有N个数组,只需要N个指针,N个指针同时进行比较,每次找最小的一个数记录(问题简化了,相当于在N个数中寻找最小的一个数)。显然N的指针更佳令人满意。那这N的指针如何进行比较?我先说的是快排的拆分函数(以一个数为基准,比该数小的在左边、大的在右边),而这个基准数是随机的,所以调用一次拆分函数,返回函数中基准值下标,如果下标大于1,再对下标的左边部分继续调用函数;如果下标小于等于1,直接返回下标为0的元素。这样的做法减少了递归次数,不必使得整个序列有序。但是这个做法还是不能让面试官满意。N个数中,只是找一个最小的数,我还能想到的是堆,但是我对于堆不熟悉,只知道当记录数很多的时候用堆最合适。我也是这样同跟面试官说的,最后再次问了时间和空间的复杂度,我理解的堆排序时间复杂度是O(nlogn),但是这个复杂度是将整个序列变得有序的复杂度,而我们只需要找一个最小的,所以我的回答是,若堆排序的时间复杂度是X,那么这种解法的时间复杂度是O(N*M*X),空间复杂度为常数。
第二道题是写代码,让我写出回文数的代码实现,给了我一个函数的定义,让我实现该函数。当然我会故意问一位数的数字算不算回文数!这道题没什么难度,所以我不慌不忙地写,也把所有边界情况都考虑到位。写了一个最简单的代码:
1 //-1:异常 2 //0:不是回文数 N 100 5 int Palindromic(int value) 6 { 7 int x = value, k = 0 ,start, end; 8 int a[N] = {0}; (x==0) ; 13 while(x!=0) 14 { 15 a[k++] = x%10; 16 x = x/10; 17 } start = 0, end = k-1; 21 if(start > end) (start == end) ; { 27 while(start<end && a[start]==a[end]) 28 { 29 start++; 30 end--; 31 } 32 if(start<end) ; ; 35 } 36 }
回文数后来仔细想想以前的代码,还有更简单不易错的代码:
1 //0:不是回文数 Palindromic2(int value) 4 { 5 int x = value; 6 int remainder = 0; (x!=0) 9 { 10 remainder = x%10; 11 reverse_value = reverse_value*10 + remainder; 12 x = x/10; 13 } (value == reverse_value) ; ; 19 }
回文数(优化) 第三题 服务器压力测试设计第三道题他说是设计题,让我设计一种方法来测试服务器的压力,听完他的题目说明,我是一脸萌比的,大概是问的“假设:服务器tps=100000,怎么测试服务器压力”,很尴尬的向他求助,能不能给点提示,他又说“假设一个线程tps=1000”,结合他的提示,我只能把与相关的知识全部说出来,如线程的通信方式:(1)管道(2)系统IPC(信号量、____、消息队列)(3)套接字Socket,其中漏了一个,因为这个问题毫无头绪,我已经有点着急了,接着继续说,要想达到100000的tps,肯定需要多个线程,我想用信号量来实现,例如我100个进程就能达到想要的tps的话,我给这些进程100个锁来实现。他忍不了,说用共享内存来实现多个进程的通信更快,我恍然大悟,哦!!我遗漏了共享内存......我急忙赞同他的说法,他又接着问我这多的线程要怎么管理呢?这...我只能认输不知道。他告诉我,需要用一个线程来管理其他多线程的并发操作。
后来自己百度了下这个问题,原来是WeTest的测试大师
三个问题问完之后,对于面试结果,我心里还是有点B数的,面试官并没有走流程让我问他问题,说今天的面试就到此吧。我起身拿起包打算离开,但还是很像问他问题,所以我先问他我能否向他提一个问题,他同意之后,我问他我们这样的本科应届生有什么建议和意见吗?他还是很耐心的跟我讲了一些对应届本科生的建议,最后说我阅历太少,经验不够,基础功不扎实。我回应了几句,并向他表示了真心的感谢之后离开了房间。