背景
跟华为大神喝酒吹牛,聊到了他招人的一些面试题,让我受益匪浅。
第一个
1.1、int的取值范围是多少?
当时我脑子里就在想不可能这么简单的,应该区分32位和64位的吧?
后来一想不对啊,int在32位和64位下都是 4byte = 4*8bit = 32bit
,也就是32个坑,所以应该是 -2^(32-1) ~ 2^(32-1)-1
再后来一想,好像漏了个16位,在16位下 int = 2byte = 2*8bit = 16bit
,所以范围应该是 -2^(16-1) ~ 2^(16-1)-1
1.2、两个int值取平均数
这个我顿时想到了越界的问题。
常规写法
int A = 2147483647;
int B = 2147483647;
int C = (A+B)/2;
// 结果
C = -1
明显越界,结果异常,这时我就换个想法,先分别除以2再相加A/2 + B/2
int A = 2147483647;
int B = 2147483647;
int C = A/2 + B/2;
// 结果
A/2 = 1073741823
B/2 = 1073741823
C = 2147483646
明显 奇数/2
取整导致数据偏差,C语言中 / 除法
,当两边都是int型数时,做整除运算。
所以我想了一个 (自己随便写的,仅供参考,欢迎提供更优方案)
-(int)Func:(int)A :(int)B {
// 相加不会越界的情况下,直接取和/2
if (A == 0 || B == 0 || (A < 0 && B > 0) || (A > 0 && B < 0)) {
return (A+B)/2;
}
if (A > 0 && B > 0) {
int x = (A-1)/2;
int y = (B-1)/2;
return x+y+1;
}
if (A < 0 && B < 0) {
int x = (A+1)/2;
int y = (B+1)/2;
return x+y-1;
}
return 0;
}
// 调用
A = 2147483647;
B = 2147483646;
C = [self Func:A :B] = 2147483646;
第二个
X^3 + Y^3 + Z^3 = XYZ;
我擦,第一反应暴力枚举
-(void)FFF {
for (int i = 1; i < 10 ; i++) { // 第一个数肯定不是0
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
if ((i*i*i + j*j*j + k*k*k) == (i *100 + j*10 +k)) {
NSLog(@"i = %d, j = %d, k = %d",i,j,k);
}
}
}
}
}
// 结果
i = 1, j = 5, k = 3
i = 3, j = 7, k = 0
i = 3, j = 7, k = 1
i = 4, j = 0, k = 7
后来搜索得知,这其实是 水仙花数,突然发现好像我想的太简单了,仅仅把X、Y、Z当做一位数,但是他们也有可能是多位数,所以上面的是不全面的。
四位的四叶玫瑰数共有3个:1634,8208,9474;
五位的五角星数共有3个:54748,92727,93084;
六位的六合数只有1个:548834;
七位的北斗七星数共有4个:1741725,4210818,9800817,9926315;
八位的八仙数共有3个:24678050,24678051,88593477
……
但是具体的算法,我一时想不出来,希望有大神指点。
第三个
大数相乘
脑子里第一反应,就是模拟基本的乘法,然后相加。但是又考虑到了越界的问题,有点犯晕。
大数乘法的几种算法分析及比较(2014腾讯南京笔试题)
拓展
其他的一些 example
求职之路(2015南京站拿到百度、美团、趋势科技、华为offer)