首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一道C++的面试有关问题,求源代码,非常感谢

2013-11-18 
一道C++的面试问题,求源代码,非常感谢!面试(Interview)描述某公司在对应聘者做过一轮笔试之后,从中选出成

一道C++的面试问题,求源代码,非常感谢!
面试(Interview)
描述
某公司在对应聘者做过一轮笔试之后,从中选出成绩最高的n 人继续进行面试。在笔试中,每位应聘者已被分配了一个整数ID,面试时将沿用这个ID。

为公平起见,组织者决定利用会议室外的圆桌,按以下方法“随机”确定面试顺序:第一个到达的应聘者在圆桌周围任意选择一个位置坐下;此后到达的每位应聘者都从前一应聘者出发,沿逆时针方向围圆桌走过m 人(前一应聘者算作走过的第1 人,同一人可能经过多次),并紧邻第m 人右侧就座;所有应聘者到齐后,从最后到达者出发,绕圆桌以顺时针方向为序进行面试。

一道C++的面试有关问题,求源代码,非常感谢

这里假定应聘者到达的时刻互异,且相对的就坐位置确定后,左、右两人之间总能插入一把椅子。

试编写一个程序,对于任给的m 及n 个应聘者ID,确定对应的面试顺序。

输入
共2行。

第1行包含两个整数,以空格分隔,依次表示n和m。

第2行包含n个整数,以空格分隔,表示先后到达的n个应聘者的ID。

输出
共1行。以空格分隔的n个整数,分别表示顺次进行面试的应聘者的ID。

输入样例
3 2
8 9 10
输出样例
10 8 9
限制
1 <= N <= 10^3

1 <= m <= 2*N

输入的ID保证在int类型的范围内。

提示
请借助列表实现 面试问题 C++
[解决办法]
数据级别是1000,所以复杂度 <= O(n^2)即可
思路是每次插入记录上一次插入的节点位置,代码如下,仅供参考:


#include <cstdio>
#define MAX 1000

struct Person{
    int id;
    struct Person* pre;
    struct Person* next;
};

struct Person* newPerson(int id)
{
    static Person a[MAX];
    static int index = 0;

    a[index].id = id;
    return &a[index++];
}

/*
    go along previous is anticlockwise, while go along next is clockwise
*/
class RoundTable{
private:
    int n;
    struct Person* last;
public:
    RoundTable():n(0), last(NULL){}
    void comeAndSit(int id, int passby);
    void printId();
};
void RoundTable::comeAndSit(int id, int passby)
{
    struct Person* p = newPerson(id);//new comer
    if(last == NULL){//the very first person
        p->pre = p->next = p;
    }
    else{//start from the last person and then go by passby people
        struct Person* q = last;
        for(passby %= n; passby > 0; --passby){
            q = q->pre;
        }
        p->next = q->next;
        p->pre = q;
        q->next = p;
    }
    last = p;
    ++n;
}
void RoundTable::printId()
{
    if(n < 1) return;

    printf("%d ", last->id);
    for(struct Person* p = last->next; p != last; p = p->next) printf("%d ", p->id);
}


int main()
{
    int i, n, m, id;
    RoundTable table;

    scanf("%d%d", &n, &m);
    for(i = 0; i < n; ++i){
        scanf("%d", &id);
        table.comeAndSit(id, m);
    }
    table.printId();

    return 0;
}

热点排行