第三届“华为杯”程序设计大赛

 

 

编程题(共3题,第一题20分,第二题30分,第三题50分,共100分。请上机编写程序,按题目要求提交文件。

 

本试题采用自动测试用例进行评分,测试用例不对考生公开,凡不满足提交要求导致不能运行或用例不通过,不予评分)。

1、  排序算法(20分)

l  问题描述

将给定的无序整数数组降序排列后输出,输入的无序数组长度为N,类型为unsigned int

l  要求实现函数

void DscSort (const int InputArray[], unsigned int n, int OutputArray[])

【输入】InputArray:  给定的无序数组

        n:                 数组长度

【输出】OutputArray: 排序后的数组

【返回】无

l  示例

输入:InputArray={1,5,4,8,3,2,9,6,7,0}

 

输出:OutputArray={9,8,7,6,5,4,3,2,1,0}

2、查找最大的不重复数(30分)

l  问题描述

如果一个数字十进制表达时,不存在连续两位相同,则称之为“不重复数”。例如,105、1234和12121都是“不重复数”,而11、100和1225不是。给定一个正整数A,返回大于A的最小“不重复数”。A小于100000

l  要求实现函数

unsigned int GetNotRepeatNum(unsigned int lValue)

【输入】lValue:  给定的数字,返回大于该值的最小不重复数

【输出】无

【返回】大于iValue的最小不重复数

l  示例

输入:iValue =54

返回: 56 

输入:iValue =10

返回: 12    

输入:iValue =98

返回: 101

输入:iValue =21099

返回: 21201

3、字符串匹配(50分)

l  问题描述

判断包含通配符的匹配字符串是否完全匹配输入的字符串,匹配字符串中包含的通配符仅有‘*’和‘?’,且通配符不会连续出现 。(要求完全匹配,而不是包含)

其中,通配符‘*’:代替0个或多个字符,通配符‘?’:代替一个字符

l  要求实现函数

int GetMatchStr (const char *ArrStr, const char *KeyStr)

【输入】 ArrStr:    给定的字符串

                 KeyStr:      包含通配符的匹配字符串

【输出】无

【返回】是否匹配,匹配返回1,不匹配返回0

l  示例

输入:” abcdefg”, “a*'”

返回:1

输入:“tommababcabc” , t?m*ab*abc

返回:1

 

现在附上第三题的答案:

int GetMatchStr (const char *ArrStr, const char *KeyStr)
{
   //先确定两个形参指针是否为空
   assert( ArrStr!= NULL && KeyStr!= NULL);

   int len=strlen(ArrStr);
   int i=0;
    switch (*KeyStr)
    {
      case '\0':
         return (*ArrStr=='\0')? 1:0;
     case '?':
         return (*ArrStr=='\0')? 0:GetMatchStr(ArrStr+1,KeyStr+1);
        case '*':
    for(i=0;i<len;i++)
    {
       int matchNum=GetMatchStr(ArrStr+i,KeyStr+1);
       if(matchNum==1)
       {
        return 1;
        break;   //此处的break中止的上一层的for循环,如果for放在if判断语句的外面,则不满足matchNum==1时,也执行循环的中止
        }
    }
     default:
        return (*ArrStr!=*KeyStr)? 0:GetMatchStr(ArrStr+1,KeyStr+1);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值