电话内容
基本上简历上写的内容都可能会聊到,会针对你擅长的某一个技术点做一些场景问答,所以写在简历上的都要做深入的探究。
笔试
笔试有两道题,也都相对简单:
- 以下代码输出的内容是什么,为什么?
NSString *a = @"test";
NSString *b = @"test";
if (a ==b) {
NSLog(@"Equal");
} else {
NSLog(@"Not Equal");
}
对于这题的答案,其实最初感觉字面量会被作为常量常量处理,这部分值本身不会发生改变,为了节约内存应该会对一样的常量做统一的存储.但是后来又觉得可能跟编译器的优化逻辑有关,最终决定使用clang命令来做一下确定.
这里使用Xcode默认的main函数做一下测试:
int main(int argc, char * argv[]) {
NSString *a = @"abc";
NSString *b = @"abc";
if (a == b) {
NSLog(@"Equal");
} else {
NSLog(@"Not Equal");
}
NSString * appDelegateClassName;
@autoreleasepool {
// Setup code that might create autoreleased objects goes here.
appDelegateClassName = NSStringFromClass([AppDelegate class]);
}
return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}
然后使用
xcrun -sdk iphonesimulator clang -rewrite-objc main.m
查看生成的文件:
#define __OFFSETOFIVAR__(TYPE, MEMBER) ((long long) &((TYPE *)0)->MEMBER)
static __NSConstantStringImpl __NSConstantStringImpl__var_folders_hz_vhd445sx35q8gbfkzf7ljrg40000gp_T_main_9371c3_mi_0 __attribute__ ((section ("__DATA, __cfstring"))) = {__CFConstantStringClassReference,0x000007c8,"abc",3};
static __NSConstantStringImpl __NSConstantStringImpl__var_folders_hz_vhd445sx35q8gbfkzf7ljrg40000gp_T_main_9371c3_mi_1 __attribute__ ((section ("__DATA, __cfstring"))) = {__CFConstantStringClassReference,0x000007c8,"abc",3};
static __NSConstantStringImpl __NSConstantStringImpl__var_folders_hz_vhd445sx35q8gbfkzf7ljrg40000gp_T_main_9371c3_mi_2 __attribute__ ((section ("__DATA, __cfstring"))) = {__CFConstantStringClassReference,0x000007c8,"Equal",5};
static __NSConstantStringImpl __NSConstantStringImpl__var_folders_hz_vhd445sx35q8gbfkzf7ljrg40000gp_T_main_9371c3_mi_3 __attribute__ ((section ("__DATA, __cfstring"))) = {__CFConstantStringClassReference,0x000007c8,"Not Equal",9};
...
...
int main(int argc, char * argv[]) {
NSString *a = (NSString *)&__NSConstantStringImpl__var_folders_hz_vhd445sx35q8gbfkzf7ljrg40000gp_T_main_9371c3_mi_0;
NSString *b = (NSString *)&__NSConstantStringImpl__var_folders_hz_vhd445sx35q8gbfkzf7ljrg40000gp_T_main_9371c3_mi_1;
if (a == b) {
NSLog((NSString *)&__NSConstantStringImpl__var_folders_hz_vhd445sx35q8gbfkzf7ljrg40000gp_T_main_9371c3_mi_2);
} else {
NSLog((NSString *)&__NSConstantStringImpl__var_folders_hz_vhd445sx35q8gbfkzf7ljrg40000gp_T_main_9371c3_mi_3);
}
...
...
}
可以看得出来,虽然两个字符串使用不同的指针指向,但是两个字符串存储的空间确实相同的。所以,对于常量编译器在编译期间确实是会进行优化的.
- 实现算法
找出数组中只出现一次的元素,要求算法复杂度为线型复杂度.
输入: [2,3,4,4,3]
输出:[2]
本身实现并不难,但是需要线型复杂度,这个就需要使用到的异或运算的性质:
相同的位进行异或运算结果为1,否则为0.
这样算法实现起来就很简单了
int * singleNumber(int *a, int size, int *returnSize) {
int sum = 0;
for (int index = 0; index < size; index++) {
sum += a[index];
}
int *result = malloc(sizeof(int));
*result = sum;
*returnSize = 1;
return result;
}