第八题各小题汇总 【微软面试100题 第八题】

题目1:

  有两个房间,一房间里有三盏灯,另一房间里有控制着这三盏灯的三个开关,这两个房间是分割开的,从一间里不能看到另一件的情况。现在要求受训者分别进这两间房一次,然后判断出这三盏灯分别是由哪个开关控制的。

  分析:通过温度来解决。

题目2:

  你让一些人为你工作了七天,你要用一根金条作为报酬。金条被分成七小块,每天给出一块。如果你能将金条切割两次,你怎样分给这些工人?

  分析:1+2+4.

题目3:

  用一种算法来颠倒一个单链表。

  可以通过画图来验证方法1和方法2。

复制代码
typedef struct NodeList
{
    struct NodeList *next;
    int data;
}NodeList;
View Code
复制代码

  方法1:递归 

复制代码
NodeList *reverseList(NodeList *head)
{
    if(head==NULL || head->next==NULL)
        return head;
    NodeList *tmp = reverse(head->next);
    head->next->next = head;
    head->next = NULL;

    return tmp;
}
View Code
复制代码

  方法2:非递归

复制代码
NodeList *reverseList(NodeList *head)
{
    if(head==NULL)
        return NULL;

    NodeList *h1,*h2;

    h1 = head->next;
    head->next = NULL;
    while(h1)
    {
        h2 = h1;
        h1 = h1->next;
        h2->next = head;
        head = h2;
    }
    return h2;
}
View Code
复制代码

题目4:

  不用乘法或加法增加8倍。现在用同样的方法增加7倍。

  分析:n<<3  (n<<3)-n

题目5:

  假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现两次以外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?

  分析:

    方法1:根据等差数列求和公式:n*(n+1)/2得,sum-1000*(1000+1)/2 = result(其中sum是整个数组的和,result是出现两次的那个数字).

    方法2:根据题意,1~1000中只有一个数字出现了两次,其他都出现了一次。则在原数组中再加入1~1000,就成了只有一个数字出现了三次,其他数字都出现了两次,可以用异或来解决.

方法2代码:

复制代码
int findX(int *a)
{
    int k = a[0];
    for(int i=1;i<=1000;i++)
    {
        k ^= i;
        k ^= a[i];
    }
    return k;
}
View Code
复制代码

posted on   tractorman  阅读(274)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

导航

统计

点击右上角即可分享
微信分享提示