华为大神出的几道题

背景

跟华为大神喝酒吹牛,聊到了他招人的一些面试题,让我受益匪浅。

第一个

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)

你可能感兴趣的:(华为大神出的几道题)