回答bestswifter的BAT面试问题

写这篇文章的主要目的是记录下bestswifter的BAT的面试问题,补充下自己的面试经验,bestswifer的面经请看BAT面试指南

百度


算法

不用临时变量怎么实现 swap(a, b)?


异或运算符^也称XOR运算符,它的规则是若参加运算的两个二进位同号,则结果为0(假);异号为1(真)。即0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0。
例:
异或

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a = 2, b = 6;

    a = a ^ b;
    b = b ^ a;
    a = a ^ b;

    printf("a = %d b = %d/n", a, b);

    return 0;
}

结果如下

a = 6 b = 2

分析:

前两个赋值语句:“a = a ^ b;”和“b = b ^ a;”相当于b = b ^ (a ^ b),而b ^ a ^ b等于a ^ b ^ b。b ^ b的结果为0,因为同一个数与相向相^,结果必为0。因此b的值等于a ^ 0,即a,其值为2。

再执行第三个赋值语句:“a = a ^ b”。由于a的值等于(a ^ b),b的值等于(b ^ a ^ b),因此,相当于a = a ^ b ^ b ^ a ^ b,即a的值等于a ^ a ^ b ^ b ^ b,等于b。

也可以用加法来实现。

void swap(int *p, int *q)
{
    *p = *p + *q;
    *q = *p - *q;
    *p = *p - *q;
}

原理也很简单。

二维有序数组查找数字


详见 剑指offer(1)-二维数组中的查找,建议最好自己再重新敲一遍代码。

亿级日志中,查找登陆次数最多的十个用户


占坑~

简述排序算法


占坑~

iOS知识相关

说说你对 OC 中 load 方法和 initialize 方法的异同。


主要说一下执行时间,各自用途,没实现子类的方法会不会调用父类的。

详见 细说OC中的load和initialize方法NSObject的load和initialize方法

load

顾名思义,load方法在这个文件被程序装载时调用。只要是在Compile Sources中出现的文件总是会被装载,这与这个类是否被用到无关,因此load方法总是在main函数之前调用。所以,不管有没有实现子类的方法,父类的方法都会被调用。

由于调用load方法时的环境很不安全,我们应该尽量减少load方法的逻辑。另一个原因是load方法是线程安全的,它内部使用了锁,所以我们应该避免线程阻塞在load方法中。

一个常见的使用场景是在load方法中实现Method Swizzle:

initialize

这个方法在第一次给某个类发送消息时调用(比如实例化一个对象),并且只会调用一次。initialize方法实际上是一种惰性调用,也就是说如果一个类一直没被用到,那它的initialize方法也不会被调用,这一点有利于节约资源。

即使子类没有实现initialize方法,也会调用父类的方法。

initialize方法主要用来对一些不方便在编译期初始化的对象进行赋值。比如NSMutableArray这种类型的实例化依赖于runtime的消息发送,所以显然无法在编译器初始化:

// In Parent.m
static int someNumber = 0;     // int类型可以在编译期赋值
static NSMutableArray *someObjects;

+ (void)initialize {
    if (self == [Parent class]) {
        // 不方便编译期复制的对象在这里赋值
        someObjects = [[NSMutableArray alloc] init];
    }
}

说说你对 block 的理解


三种 block,栈上的自动复制到堆上,block 的属性修饰符是 copy,循环引用的原理和解决方案。
详细资料可见

谈Objective-C block的实现
block没那么难(一):block的实现
block没那么难(二):block和变量的内存管理
block没那么难(三):block和对象的内存管理

Block虽然知道怎么用,但是要理解它的原理和内存管理,还是很困难的,建议看下《iOS与OS X多线程和内存管理》这本书。

说说你对 runtime 的理解


发布了90 篇原创文章 · 获赞 2 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章