笔试题练习(三)

1, 两个一样的杯子,分别装着同体积的茶水和牛奶,然后茶水取一瓢到牛奶杯里,搅匀后从牛奶杯里取一瓢到茶水杯里,问牛奶杯里茶水多还是茶水杯里牛奶多?(华为)

答:体积不变,是一样多。 假设茶水有1000单位,牛奶也一样是1000单位。无论他倒多少次,假设最后茶水杯里有X单位的牛奶,那么茶水杯里的茶水就是(1000-X)。所以牛奶杯里的茶水就是X单位。所以是一样多的。

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

答:第一次:5个分为一组 找到轻的那组

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

3,从199999之间,求出所有满足以下条件的数x1x是完全平方数;2x有两位数相同。如:12111*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 * << endl;
        }
    }
    
return   0

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

#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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Perl编程语言是一种强大的脚本编程语言,适用于各种任务和领域,包括文本处理、系统管理、网络编程等。下面是一个Perl编程的笔试练习题的解答: 题目:编写一个Perl脚本,统计一个文本文件中每个单词出现的次数,并按照频率从高到低的顺序输出。 解答: ```perl #!/usr/bin/perl use strict; use warnings; my $filename = 'text.txt'; open(my $file, "<", $filename) or die "无法打开文件:$!"; my %word_count; while (my $line = <$file>) { chomp($line); my @words = split(' ', $line); foreach my $word (@words) { $word =~ s/[^a-zA-Z]//g; # 只保留字母字符 next if $word eq ''; # 跳过空字符串 $word_count{lc($word)}++; } } close($file); foreach my $word (sort { $word_count{$b} <=> $word_count{$a} } keys %word_count) { print "$word: $word_count{$word}\n"; } ``` 这个Perl脚本首先打开指定的文本文件,并使用`<`操作符将文件内容读入到循环变量`$line`中。在每次迭代中,我们将每一行字符串使用空格进行分割,得到一个单词数组`@words`。接下来,我们使用一个循环遍历`@words`数组中的每个单词,并进行一些处理: 1. 使用正则表达式`s/[^a-zA-Z]//g`去除单词中的非字母字符; 2. 使用`next if $word eq '';`跳过空字符串; 3. 使用`lc($word)`将单词转换为小写字母形式,并将其作为哈希表`%word_count`的键,将该单词的出现次数加一。 在循环结束后,脚本将按照单词出现次数从高到低的顺序对`%word_count`进行排序,并循环打印输出每个单词和其出现次数。 以上是对Perl编程的笔试练习题的参考解答,希望对您有帮助。如果有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值