腾讯一面
- 没有自我介绍,先拿下我的简历,让我在白纸上画,项目的架构。我画了几分钟,然后跟面试官介绍。
- 这次最大的一个败点是,我没有在手机上安装项目应用,这也是线下面试,与线上面试的一个不同点。
- 后来写一个题,合并数组的题。
- 总结,腾讯这次我感觉看项目,清楚项目的整体架构,后很好,最好安装上去,我估计这次是跪了。不过也没关系,我的项目经历确实有点少,这次面试跟我之前的面试不太一样,这次真的比较看实力,java和jvm,计算机网络,其他的都没有问。
/**
* 腾讯Android岗,一面面试题目
* Created by Zheng548 on 2017/4/13 .
* 转载请注明出处(注明作者,和原链接)
* @author Zheng548
* 链接:http://blog.csdn.net/zheng548/article/details/70173634
*
* 有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2。请实现一个函数,把A2中的所有数字插入到A1中并且所有的数字是排序的。
* 以下是我的实现
*/
public class MergeSortedArray {
public static void insertSortedArray(int[] a1, int[] a2) {
if (a1 == null || a1.length <= 0 || a2 == null || a2.length <= 0) {
return;
}
//因为a1末尾有足够多的内存空间,所以a1中的元素个数小于a1.length();
//所以,先求a1中元素的个数
int cntInA1 = 0;
while (a1[cntInA1] != 0) {
cntInA1 ++;
}
int cntInA2 = a2.length;
//a2数组空间全部用完,没有多余的内存int mergeSize = cntInA1 + cntInA2;
mergeSize --;
cntInA1 --;
cntInA2 --;
while (cntInA2 >= 0) {
if (a2[cntInA2] >= a1[cntInA1]) {
a1[mergeSize --] = a2[cntInA2 --];
} else {
a1[mergeSize --] = a1[cntInA1 --];
}
}
}public static void main(String[] args) {
int[] a1 = new int[10];
a1[0] = 1;
a1[1] = 2;
a1[2] = 4;
a1[3] = 5;
a1[4] = 8;
int[] a2 = new int[] {3,6,7};
insertSortedArray(a1, a2);
for (int val : a1) {
System.out.print(val + " ");
}
}
}
二面 【腾讯 一面 二面 2017暑期实习招聘】面试官非常和蔼,非常友善。他先我进行了自我介绍,然后聊了下项目。聊的时间也不是太长,后来,问我对应聘的岗位有没有了解,自己为什么能胜任这个岗位?
期间,做了一道题,感觉腾讯非常重视做题。
那个题是这样的:
/**
* 腾讯Android岗,二面面试题 《去除驼峰字符串》
* 面试官写的原题记不得了,大概意思是这样的:
* 给定一个驼峰样式的字符串 例如“...adbabfgh.....”,其中bab为驼峰,
两个一样的字符夹着一个不一样的字符, 返回去掉所有驼峰的字符串。
* Created by Zheng548 on 2017/4/14 0014.
* 转载请注明出处(注明作者,和原链接)
* @author Zheng548
* 链接:http://blog.csdn.net/zheng548/article/details/70173634
*/
public class T {public static void main(String[] args) {
System.out.println(fun(" "));
System.out.println(fun("abele"));
System.out.println(fun("abelea"));
System.out.println(fun("abeleaea"));
System.out.println(fun("abeleaeaa"));
System.out.println(fun("abeleaeaaw"));
System.out.println(fun("abeleaeaawq"));
System.out.println(fun("abeleaeaawqk"));
System.out.println(fun("abeleaeaawqkl"));
}private static String fun(String str) {
/**
* 健壮性分析str == null 或者str.length <= 0
*/
if (str == null || str.length() <= 0) {
return null;
}
/**
* 当字符串长度小于等于2,不可能存在驼峰,直接返回
*/
if (str.length() <= 2) {
return str;
}StringBuilder sb = new StringBuilder();
int i;
//全局变量i,用于遍历字符串
boolean flag = false;
//标志位,用于递归出口条件判断。初始为false
for (i = 0;
i < str.length() - 2;
i ++) {
if (str.charAt(i) == str.charAt(i + 2)
&& str.charAt(i) != str.charAt(i + 1)) {
//驼峰存在i = i + 2,同时外层for 循环 + 1,共计增加3
i = i + 2;
flag = true;
//当有驼峰时,说明递归没有结束,仍需判断
continue;
}
/**
* 若str.charAt(i)不是驼峰的组成部分,则append到后面
*/
sb.append(str.charAt(i));
}
/**
* flag 为flase,说明if (str.charAt(i) == str.charAt(i + 2)
&& str.charAt(i) != str.charAt(i + 1))
没有只i系那个,也就是没有驼峰,递归出口,返回
*/
if (!flag) {
return str;
}/**
* 上面for循环有i < str.length() - 2;
的限制,所以下行代码,处理字符串末尾字符
*/
sb.append(str.substring(i));
/**
* 尾递归调用
*/
return fun(sb.toString());
}
}