当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

学习分享:C++面试笔试题

    看一下这是一些C++面试的笔试,对于学习C++的你也许也是个考验吧,有时间做做吧

    给定九个数,例如:1,3,3,5,6,7,8,8,9计算出这九个数的排列的种数。需要考虑重复情况,如果给定9个1,则只有一种结果。

    限制:不能使用stl库

    要求:完成函数 unsigned int foo(unsigned int *arr);

    输入算法代码,并给出算法复杂度分析。

    分析:

 #include <cstdlib>
#include <iostream>
using namespace std;
unsigned int foo(unsigned int *arr)
{
    unsigned int p[] ={1,2,6,24,120,720,5040,40320,362880};
    unsigned int i,j,c,s=p[8];//first the number is p99
    for(i = 0; i < 7; i++)
       for(j = i+1; j < 8; j++)
       {
           if(arr[i]>arr[j])  //swap two number
           {
               arr[i]^=arr[j];
               arr[j]^=arr[i];
               arr[i]^=arr[j];
           }
       }
    i = 0;
    c = 0;
    while(i<8)
    {
        j = i+1;
        while(arr[i]==arr[j])//compute the number of the repetition
        {
            c++;
            j++;
        }
        s/=p[c];
        c=0;
        i=j; [Page]
    }
    return s;
}

int main()
{
    unsigned int a[]={1,3,3,5,6,7,8,8,9};
    cout<<\"The number of permutation is: \"<<foo(a)<<endl;
    system(\"pause\");
    return 0;
}

    还可以改进排序那部分。

    转一个经典的题目:

    给一个天平,问如何用3次把这个小球找出来并且求出这个小球是比其他的轻还是重将12个球分别编号为a1,a2,a3……a10,a11,a12.

    第一步:将12球分开3拨,每拨4个,a1~a4第一拨,记为b1, a5~a6第2拨,记为b2,其余第3拨,记为b3;

    第二步:将b1和b2放到天平两盘上,记左盘为c1,右为c2;这时候分两中情况:

    1.c1和c2平衡,此时可以确定从a1到a8都是常球;然后把c2拿空,并从c1上拿下a4,从a9到a12四球里随便取三球,假设为a9到a11,放到c2上。此时c1上是a1到a3,c2上是a9到a11.从这里又分三种情况:

    A:天平平衡,很简单,说明没有放上去的a12就是异球,而到此步一共称了两次,所以将a12随便跟11个常球再称一次,也就是第三次,马上就可以确定a12是重还是轻;

    B:若c1上升,则这次称说明异球为a9到a11三球中的一个,而且是比常球重。取下c1所有的球,并将a8放到c1上,将a9取下,比较a8和a11(第三次称),如果平衡则说明从c2上取下的a9是偏重异球,如果不平衡,则偏向哪盘则哪盘里放的就是偏重异球;

    C:若c1下降,说明a9到a11里有一个是偏轻异球。次种情况和B类似,所以接下来的步骤照搬B就是;

    2.c1和c2不平衡,这时候又分两种情况,c1上升和c1下降,但是不管哪种情况都能说明a9到a12是常球。这步是解题的关键。也是这个题最妙的地方。

    A:c1上升,此时不能判断异球在哪盘也不能判断是轻还是重。取下c1中的a2到a4三球放一边,将c2中的a5和a6放到c1上,然后将常球a9放到c2上。至此,c1上是a1,a5和a6,c2上是a7,a8和a9.此时又分三中情况:

    1)如果平衡,说明天平上所有的球都是常球,异球在从c1上取下a2到a4中。而且可以断定异球轻重。因为a5到a8都是常球,而第2次称的时候c1是上升的,所以a2到a4里必然有一个轻球。那么第三次称就用来从a2到a4中找到轻球。这很简单,随便拿两球放到c1和c2,平衡则剩余的为要找球,不平衡则哪边低则哪个为要找球;

    2)c1仍然保持上升,则说明要么a1是要找的轻球,要么a7和a8两球中有一个是重球(这步懂吧?好好想想,很简单的。因为a9是常球,而取下的a2到a4肯定也是常球,还可以推出换盘放置的a5和a6也是常球。所以要么a1轻,要么a7或a8重)。至此,还剩一次称的机会。只需把a7和a8放上两盘,平衡则说明a1是要找的偏轻异球,如果不平衡,则哪边高说明哪个是偏重异球;

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接