笔试题练习(三)

本文包含四个有趣的智力挑战题及解答,包括液体转移问题、硬币筛选法、寻找特定平方数以及网球场地管理系统的设计实现。

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,且它有两位数相同,故它满足条件。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->/************************************************************************/
/*Author:phinecosDate:2009-05-20
/***********************************************************************
*/
#include
<iostream>
#include
<map>
#include
<string>
usingnamespacestd;

structnode
{
intvalue;
intcount;
};

boolisOk(intnum)
{
inti,tmp;
boolresult=false;
map
<int,int>numMap;

//初始化
for(i=0;i<10;++i)
{
numMap[i]
=0;
}
//剥离数位
while(num!=0)
{
tmp
=num%10;
++numMap[tmp];
num
/=10;
}
//判断是否仅有一个数位有个
intcount=0;
map
<int,int>::iteratoriter;
for(iter=numMap.begin();iter!=numMap.end();++iter)
{
if(iter->second==2)
{
++count;
}
}
if(count==1)
{
//仅有位出现次
result=true;
}
returnresult;
}
intmain(intargc,char*argv[])
{
for(inti=1;i<=316;++i)
{
if(isOk(i*i))
{
cout
<<i*i<<endl;
}
}
return0;
}

4,题目:网球中心共有100个网球场,每个单位可以来申请1到100的场地,申请的场地编号必须是连续的,如果场地已经被其他单位占用,就不能再次使用,而且单位在使用完场地后必须归还。请设计一个完整的系统。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include<iostream>
#include
<vector>
#include
<string>
usingnamespacestd;

/************************************************************************/
/*Author:phinecosDate:2009-05-20*/
/************************************************************************/
structTennisCourt
{
//网球场
intserialNum;//编号
boolbOccupied;//是否被占用
stringOwner;//占用者
};
//网球中心
classTennisCenter
{
public:
TennisCenter();
voidprint()const;
boolrequestCourts(intnum,constchar*requester,vector<int>&alloctedCourts);//请求num块场地,若分配成功,则返回分配的场地的编号
boolreturnCourts(constchar*returner,constvector<int>&alloctedCourts);//归还连续编号的场地
intgetEmpytCourts()const;
protected:
voidinit();
voidallocateCourts(intbegin,intend,constchar*requester);
boolIsValidOwner(intbegin,intend,constchar*returner);
voidfreeCourts(intbegin,intend);
private:
vector
<TennisCourt>courts;//场地
intnEmptyCourt;//空余的场地
staticconstintMAX_CAPACITY=100;//场地最大数目
};
TennisCenter::TennisCenter()
{
this->init();
}
voidTennisCenter::init()
{
nEmptyCourt
=MAX_CAPACITY;//空余块场地
courts.resize(MAX_CAPACITY);
for(inti=0;i<MAX_CAPACITY;++i)
{
courts[i].serialNum
=i+1;
courts[i].bOccupied
=false;
courts[i].Owner
="";
}
}
voidTennisCenter::print()const
{
vector
<TennisCourt>::const_iteratoriter;
for(iter=courts.begin();iter!=courts.end();++iter)
{
cout
<<iter->serialNum<<'/t';
if(iter->bOccupied)
cout
<<iter->Owner<<'/t';
cout
<<endl;
}
}
voidTennisCenter::allocateCourts(intbegin,intend,constchar*requester)
{
for(inti=begin;i<end;++i)
{
courts[i].bOccupied
=true;
courts[i].Owner
=requester;
--this->nEmptyCourt;//剩余场地递减
}
}
boolTennisCenter::IsValidOwner(intbegin,intend,constchar*returner)
{
//是否是合法拥有者
for(inti=begin;i<=end;++i)
{
if(courts[i].Owner.compare(returner)!=0)
{
returnfalse;
}
}
returntrue;
}
voidTennisCenter::freeCourts(intbegin,intend)
{
for(inti=begin;i<=end;++i)
{
courts[i].bOccupied
=false;
courts[i].Owner
="";
++this->nEmptyCourt;//剩余场地递增
}
}
boolTennisCenter::requestCourts(intnum,constchar*requester,vector<int>&alloctedCourts)
{
//请求num块场地,若分配成功,则返回true,输出参数中保存分配的场地的编号,否则返回false
cout<<"剩余"<<this->nEmptyCourt<<"块场地"<<endl;
alloctedCourts.clear();
boolresult=false;
if(num>this->nEmptyCourt)//剩余场地不够,不需再查看
returnfalse;

//剩余场地数目够,看是否有足够连续多的场地满足用户请求
inti,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;
}
}
returnresult;
}
boolTennisCenter::returnCourts(constchar*returner,constvector<int>&alloctedCourts)
{
//归还连续编号的场地
intbegin=alloctedCourts[0]-1;
intend=alloctedCourts[alloctedCourts.size()-1]-1;
if(!this->IsValidOwner(begin,end,returner))
{
//非法持有者不能归还
returnfalse;
}
this->freeCourts(begin,end);
returntrue;

}
intTennisCenter::getEmpytCourts()const
{
returnthis->nEmptyCourt;
}
voidshowAllocatedCourts(constvector<int>&courts)
{
vector
<int>::const_iteratoriter;
for(iter=courts.begin();iter!=courts.end();++iter)
{
cout
<<*iter<<endl;
}
}
intmain(intargc,char*argv[])
{
TennisCentertennisCenter;
vector
<int>allocatedCourts;
boolresult=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();
return0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值