面试中的智力题及编程实践

我曾经把我从各处总结的智力题(也即是稍微需要点技巧的)题目,拿给周围的人解,鲜有人能很快给出解决方案,更不消说充满技巧性的解决方案。所以,一时之间,第一次接触,想不出答案,并不丢脸,需要有意识的训练与总结。

命题与其逆否命题相互等价

AB¬B¬A

举例,所有的POD类型都是Aggregates,
则如果一个类不是Aggregates,则它断然不是POD类型。

PODAggregates¬Aggregates¬POD

三个瓶盖能换一瓶水,问100个人需要喝水,最少需要买多少瓶水即可解决100人的喝水问题

1+2 -> 3
1+2+2 -> 6
1+2+2+2 -> 9
….

100个人,3人做一组,共33组,余1人,也即100/3==33, 100%3==1,3瓶水换一瓶,也即一组需要买两瓶(需要有一个作为启动),所以结论很明显了,100/33*2+1=67

def need(n, b):
    return int(n/b*(b-1))+n%b

我们接着使用更为常规的编程方法实现对所需瓶盖的计算:

int need(int n, int k)
{
    // n: 表示需要喝饮料的人数
    // k: 表示多少瓶盖可以换一瓶水
    int cnt, drunk, caps = 0, 0, 0;
                // cnt: 表示买多少瓶水
                // drunk: 表示已喝过水的人数
                // caps: 当前的瓶盖数
    while (drunk < n)
    {
        ++cnt; ++drunl; ++caps;
        if (caps % k == 0) // if(caps == k)
        {
            ++drunk;
            caps = 1;
        }
    }
    return cnt;
}

int main(int, char**)
{
    std::cout << need(100, 3) << std::endl;
                        // 67
    return 0;
}

概率问题

公司年会,一个员工中奖的概率是 110 ,他有十次抽奖的机会,请问他很不幸,一次都没有抽中的概率是?
公司年会,一个员工中奖的概率是 110000 ,他有10000次抽奖的机会,请问他很不幸,一次都没有抽中的概率是?

1(1110)1010.349=0.6511(1110000)1000010.368=0.632

本质是:

limn(11n)n=1e

1e0.36787944117144233

你可能感兴趣的:(面试中的智力题及编程实践)