最近在招聘iOS/Android开发工程师, 为了提高效率总结了2个笔试题。 能甄别出iOS非科班出身的人, 也能判断出大学的学习成绩。 难倒一大片iOS、Android、Java开发。。。
第一题: 请给出输出结果。
int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};
int *ptr = (int*)(&a[0] +1);
printf("%d,%d,%d,%d,%d", *(&a[0][0]+1), *ptr, *(ptr-1), sizeof(a), sizeof(ptr));
结果: 2,6,5,40,4
分析:
本题是考验C语言基础, 也可以考验初级iOS开发, 看他/她是否为iOS培训班出身的, 一般培训生都答不出此题。现在很多两三年工作经验的iOS开发都是假的, 培训机构教出来的, 在招聘时一定要注意!!! 如果此题答不上来, 再让他用C语言写个标准的最小宏#define MIN(a,b) ((a)<(b)? (a):(b)) , 还答不出来, 面试可以结束了
对于高级或资深Android开发, 本题同样可以问,因为大学里都学过C/C++。 我在面试某公司Android开发时,还被问到C++的拷贝构造函数形参里为什么有& 高级/资深开发不仅要有技术深度,还要有一定的技术广度。 &在C++里是与, 跟指针作用类似, 放在拷贝构造函数形参里是因为形参可以直接使用被引用对象的值, 不加&操作符无法拿到形参指向的对象。
第二题: 用泛型写个静态函数, 形参是类的.class, 返回值是这个类的对象。
参数答案:
public static <T> T getClassExt(Class<T> clz){
if (clz == null) {
return null;
}
T obj = null;
try {
obj = clz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return obj;
}
或者
public static <T> T getClassExt(Class<T> clz){
if (clz == null) {
return null;
} T obj = null; //默认执行没有形参的构造函数, 得到实例
Constructor<?>[] constructors = clz.getConstructors();
if (constructors == null || constructors.length==0) {
return null;
}
try {
obj = (T) constructors[0].newInstance();
} catch (InvocationTargetException e) {
e.printStackTrace();
}catch (IllegalAccessException e) {
e.printStackTrace();
}catch (InstantiationException e) {
e.printStackTrace();
}
return obj;
}
分析: 本题主要是考验泛型和反射, 我们用的fastjson或gson的解析函数JSon.parseObject,Gson.parse都用到了泛型和反射, 而且Android热修复、插件化都用到了反射, 高级/资深开发写不出来就说不过去了。 招聘java后台开发时也可以问这道题。