虽然这家公司不是什么BAT大厂,估计也没有什么人会看到这篇文章,但是作为一个梦想着进Bat的渣渣,怎么能不对自己每次面试进行总结呢?
回顾今天的面试,其实整体感觉还Ok的,结合着简历的项目经验问,但是问题就是自己笔试太水了,两道和算法沾边的,自己一道题都没做出来(找个借口,下大雨淋傻了,还有做笔试的时候旁边太吵了)。
有一说一还是自己算法太水,平时几乎不关注这些东西,经历都在中间件上面,跟一些中间件的源码,说到底还是自己太水,大学那几年没认真花功夫在编程上,大学的学习只是为了应付期末考。环境很重要,如果可以重来,我应该高三复读一年,考个好点的学校,而不是随便上一个二本。最近也是无数次梦到自己在高考,高考已然成了我心里面的一个解不开的结。但是那又怎样呢?都说“种一棵树最好的时间是从前,其次是现在”。那么就从现在认真打基础,争取能实现自己心中的梦想。
第一道题
给了一个数列an = an-1 +an-2 ,求第n个元素是多少,其实也就是数列问题
原题是这样的:
存在一列数: 1 1 2 3 5 8 13… 求第四十位是多少,要求用递归的思想。
下面是我的解法,当时脑子秀逗了,在纸上怎么都写不出来…
public class ResuiveSum {
private static int i = 0;
private static int doSum(int pre, int next, int indexOf) {
// 处理边界值 第一位元素是几
if (indexOf == 1) {
return pre;
}
// 处理边界值 第二位元素是几
if (indexOf == 2) {
return next;
}
// 请第N位的元素是几,需要加N-2次 例如,求第三位是几 那么就是1+1 一共做了1次加运算
if (i == indexOf-2) {
return next;
}
int temp = pre;
pre = next;
next = temp + next;
i++;
return doSum(pre, next, indexOf);
}
public static void main(String[] args) {
int i = doSum(1, 1, 40);
System.out.println(i); // 102334155
}
}
第二道题
有这样一个数组 1,0,3,12,0,5 让你把0都排在数组的最后面,且保持其余的元素相对有序 示例:{1,0,3,12,0,5} 变为{1,3,5,12,0,0}
- 要求不能使用数组copy
- 要求操作次数最少
我的答案本体操作是2次,但是我不能保证我的算法实现是正确的,我目前的思路就是先遍历一遍把0都搞到数组后面去,然后对非零部分进行冒泡排序。
public class MinSum {
// 有一个这样的数组,需要把0都移到数组最后面,且保持其余的元素相对有序
// 要求不能使用数组copy
// 要求操作次数最少
// 示例:{1,0,3,12,0,5} 变为{1,3,5,12,0,0}
// 全局交换次数
static int count = 0;
public static void main(String[] args) {
int[] array = {1,0,3,12,0,5};
// int[] array = {0,222,1,0,3,12,0,5,0};
System.out.println(Arrays.toString(sort(array)));
System.out.println("交换次数:"+count);
}
public static int[] sort(int[] array) {
// 标记,假定最后一个元素不为0
int noneZero = array.length-1;
for(int i=0;i<=noneZero;i++) {
if (array[i] == 0) {
// 从后往前找第一个非0的元素,找到了就把他们交换(包含自身)
for (int j=noneZero;j>=i;j--) {
// 如果不等于0,则交换,但是自己跟自己不交换
if (array[j]!=0 && array[i]!=array[j]) {
array[i] =array[j];
array[j] = 0;
count++;
break;
} else {
noneZero--;
}
}
}
}
// 到这里,为0 的元素全部去到了数组尾部,在对前半部分进行冒泡排序的
System.out.println(Arrays.toString(array));
System.out.println("最后一个不为0元素的索引"+noneZero);
for(int m=0;m<noneZero;m++) {
for (int n=m+1;n<noneZero+1;n++) {
// 如果前面的大于后面的 则进行交换
if (array[m]>array[n]) {
int temp = array[m];
array[m] = array[n];
array[n] = temp;
count++;
}
}
}
return array;
}
}
总体来说题目还是很简单,第一道题我回来后在电脑上五分钟就写出来了,第二道题还是做了有一会。(嗨,还是菜啊)