笔试题练习(三)

简介:
1, 两个一样的杯子,分别装着同体积的茶水和牛奶,然后茶水取一瓢到牛奶杯里,搅匀后从牛奶杯里取一瓢到茶水杯里,问牛奶杯里茶水多还是茶水杯里牛奶多?(华为)
答:体积不变,是一样多。 假设茶水有1000单位,牛奶也一样是1000单位。无论他倒多少次,假设最后茶水杯里有X单位的牛奶,那么茶水杯里的茶水就是(1000-X)。所以牛奶杯里的茶水就是X单位。所以是一样多的。

2, 有10个硬币外形无差别,知道其中一个硬币重量比较轻,要在天秤上怎么样只称两次不用砝码就找出那个假的?
答:第一次:5个分为一组 找到轻的那组

第二次:在有问题那组里任意选4个 两个一组再称。
1)如天平平衡,那么没有选的那个有问题。
2)如不平衡,可以知道轻的那一边有问题,只有2个,拿起其中一个,另一边也取一个,如现在平衡,那么拿起的那一个有问题, 如不平衡没取的那个就是。

3,从1-99999之间,求出所有满足以下条件的数x:1、x是完全平方数;2、x有两位数相同。如:121=11*11,且它有两位数相同,故它满足条件。

复制代码
/************************************************************************/
/* Author:phinecos   Date:2009-05-20                                                                     
/************************************************************************/
#include <iostream>
#include <map>
#include <string>
using namespace std;

struct node
{
    int value;
    int count;
};

bool isOk(int num)
{
    int i,tmp;
    bool result = false;
    map<int, int> numMap;

    //初始化
    for (i = 0; i< 10; ++i)
    {
        numMap[i] = 0;
    }
    //剥离数位
    while (num != 0)
    {
        tmp = num%10;
        ++numMap[tmp];
        num /= 10;
    }
    //判断是否仅有一个数位有个
    int count = 0;
    map<int,int>::iterator iter;
    for (iter = numMap.begin(); iter != numMap.end(); ++iter)
    {
        if (iter->second == 2)
        {
            ++count;
        }
    }
    if (count == 1)
    {//仅有位出现次
        result = true;
    }
    return result;
}
int main(int argc, char* argv[]) 
    for (int i=1; i <= 316; ++i)
    {
        if (isOk(i*i))
        {
            cout << i*i <<endl;
        }
    }
    return 0; 
复制代码
4,题目:网球中心共有100个网球场,每个单位可以来申请1到100的场地,申请的场地编号必须是连续的,如果场地已经被其他单位占用,就不能再次使用,而且单位在使用完场地后必须归还。请设计一个完整的系统。

复制代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;

/************************************************************************/
/* Author:phinecos    Date:2009-05-20                                                                     */
/************************************************************************/
struct TennisCourt
{//网球场
    int serialNum;//编号
    bool bOccupied;//是否被占用
    string Owner;//占用者
};
//网球中心
class TennisCenter
{
public:
    TennisCenter();
    void print()const;
    bool requestCourts(int num, const char* requester,vector<int>& alloctedCourts);//请求num块场地,若分配成功,则返回分配的场地的编号
    bool returnCourts(const char* returner, const vector<int>& alloctedCourts);//归还连续编号的场地
    int getEmpytCourts()const;
protected:
    void init();
    void allocateCourts(int begin, int end, const char* requester);
    bool IsValidOwner(int begin, int end, const char* returner);
    void freeCourts(int begin, int end);
private:
    vector<TennisCourt> courts;//场地
    int nEmptyCourt;//空余的场地
    static const int MAX_CAPACITY = 100;//场地最大数目
};
TennisCenter::TennisCenter()
{
    this->init();
}
void TennisCenter::init()
{
    nEmptyCourt = MAX_CAPACITY;//空余块场地
    courts.resize(MAX_CAPACITY);
    for (int i = 0; i < MAX_CAPACITY; ++i)
    {
        courts[i].serialNum = i+1;
        courts[i].bOccupied = false;
        courts[i].Owner = "";
    }
}
void TennisCenter::print()const
{
    vector<TennisCourt>::const_iterator iter;
    for (iter = courts.begin(); iter != courts.end(); ++iter)
    {
        cout << iter->serialNum << '\t' ;
        if(iter->bOccupied)
            cout<< iter->Owner << '\t';
        cout <<endl;
    }
}
void TennisCenter::allocateCourts(int begin, int end, const char* requester)
{
    for (int i = begin;i < end; ++i)
    {
        courts[i].bOccupied = true;
        courts[i].Owner = requester;
        --this->nEmptyCourt;//剩余场地递减
    }
}
bool TennisCenter::IsValidOwner(int begin, int end, const char* returner)
{//是否是合法拥有者
    for (int i = begin;i <= end; ++i)
    {
        if (courts[i].Owner.compare(returner) != 0)
        {
            return false;
        }
    }
    return true;
}
void TennisCenter::freeCourts(int begin, int end)
{
    for (int i = begin;i <= end; ++i)
    {
        courts[i].bOccupied = false;
        courts[i].Owner = "";
        ++this->nEmptyCourt;//剩余场地递增
    }
}
bool TennisCenter::requestCourts(int num, const char* requester, vector<int>& alloctedCourts)
{//请求num块场地,若分配成功,则返回true,输出参数中保存分配的场地的编号,否则返回false
    cout << "剩余" << this->nEmptyCourt << "块场地" <<endl;
    alloctedCourts.clear();
    bool result = false;
    if (num > this->nEmptyCourt)//剩余场地不够,不需再查看
        return false;

    //剩余场地数目够,看是否有足够连续多的场地满足用户请求
    int i,j,k;
    for (i = 0; i < MAX_CAPACITY; ++i)
    {
        for (j = i,k = 0; j < MAX_CAPACITY && k< num; ++j,++k)
        {
            if (courts[j].bOccupied == true)
            {//有被占用,未能连续
                break;
            }
        }
        if (k == num)
        {//有连续num个空场地,分配给请求者
            this->allocateCourts(i,i+num,requester);
            for (k = i; k < i+num; ++k)
            {
                alloctedCourts.push_back(k+1);
            }
            result = true;
            break;
        }
    }
    return result;
}
bool TennisCenter::returnCourts(const char* returner, const vector<int>& alloctedCourts)
{//归还连续编号的场地
    int begin = alloctedCourts[0]-1;
    int end = alloctedCourts[alloctedCourts.size()-1]-1;
    if (!this->IsValidOwner(begin, end, returner))
    {//非法持有者不能归还
        return false;
    }
    this->freeCourts(begin, end);
    return true;

}
int TennisCenter::getEmpytCourts()const
{
    return this->nEmptyCourt;
}
void showAllocatedCourts(const vector<int>& courts)
{
    vector<int>::const_iterator iter;
    for (iter = courts.begin(); iter != courts.end(); ++iter)
    {
        cout << *iter << endl;
    }
}
int main(int argc, char* argv[]) 
{
    TennisCenter tennisCenter;
    vector<int> allocatedCourts;
    bool result = tennisCenter.requestCourts(30,"张三",allocatedCourts);
    if (result)
    {
        showAllocatedCourts(allocatedCourts);
    }
    else
    {
        cout << "无足够的场地分配" << endl;
    }
    cout << "归还前: " << tennisCenter.getEmpytCourts() << endl;
    tennisCenter.print();
    tennisCenter.returnCourts("张三",allocatedCourts);
    cout << "归还后: " << tennisCenter.getEmpytCourts() << endl;
    tennisCenter.print();
    cout <<endl << endl;
    if (tennisCenter.requestCourts(60,"李四",allocatedCourts))
    {
        showAllocatedCourts(allocatedCourts);
    }
    else
    {
        cout << "无足够的场地分配" << endl;
    }
    cout <<endl << endl;
    cout << "归还前: " << tennisCenter.getEmpytCourts() << endl;
    tennisCenter.print();
    tennisCenter.returnCourts("李四",allocatedCourts);
    cout << "归还后: " << tennisCenter.getEmpytCourts() << endl;
    if (result = tennisCenter.requestCourts(20,"王五",allocatedCourts))
    {
        showAllocatedCourts(allocatedCourts);
    }
    else
    {
        cout << "无足够的场地分配" << endl;
    }
    cout << "王五还未归还."<< endl;
    tennisCenter.print();
    return 0; 

复制代码




本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2009/05/20/1470724.html,如需转载请自行联系原作者
目录
相关文章
|
网络协议 Java 调度
笔试题总结
32位机器上,以下结构的sizeof(P)为 struct A { int a; char b; int c; char d; } struct P { struct A w[2]; short b; struct A* p; } /*考察结构体对齐和填充: 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如果不是,编译器会自动在成员间填充。
986 0
|
算法 机器学习/深度学习 BI
|
机器学习/深度学习
|
机器学习/深度学习 搜索推荐 索引