华为2011编程大赛初赛成都赛区试题

排序算法

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}

(冒泡法)

#include "stdafx.h"
#include "iostream"

using namespace std;

#define  MAX 10

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

int _tmain(int argc, _TCHAR* argv[])
{
	int InputArr[MAX]={1,5,4,8,3,2,9,6,7,0};
	int OutputArr[MAX]={0};
	DscSort(InputArr,10,OutputArr);
	for (int i=0;i<10;i++)
	{
		cout<<OutputArr[i]<<" ";
	}
	
	getchar();
	return 0;
}

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

	for ( int i=0;i < n;i++ )
	{
		OutputArray[i] =InputArray[i];
	}

	int flag=0;
	unsigned int k=0;
	int temp=0,i=0;

	do 
	{
		flag=0;
		for (k=0;k<n-1;k++)
		{
			if (OutputArray[k]<OutputArray[k+1])
			{
				temp =OutputArray[k];  
				OutputArray[k]=OutputArray[k+1];  
				OutputArray[k+1]=temp;  
				flag=1;
			}
		}
		k++;
	} while (i<n&&flag==1);

}

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

l  问题描述

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

l  要求实现函数

unsigned int GetNotRepeatNum(unsigned intlValue)

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

【输出】 无

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

l  示例

输入: iValue =54

返回: 56

 

输入: iValue =10

返回: 12   

 

输入: iValue =98

返回: 101

 

输入: iValue =21099

返回: 21201


// ConsoleAppGetNotRepeatNum.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "iostream"

unsigned int GetNotRepeatNum(unsigned int lValue);

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int nValue=0,num=0;
	do 
	{
	
		cout<<"请输入一个不小于10的正整数:"<<endl;
		cin>>nValue;

		if (nValue<0||nValue<10)
		{
			cout<<"您的输入有误!请输入两位(及其以上)的正整数:"<<endl;
			cin>>nValue;
		}
		num=GetNotRepeatNum(nValue);
		cout<<"该数的最小不重复数为:"<<endl<<num<<endl;
	} while (1);
	getchar();
	system("pause");
	return 0;
}

unsigned int GetNotRepeatNum(unsigned int lValue)
{
	int backNum=0;
	int nValue=0;
	int digit[100]={0};
	do 
	{
		lValue++;
		int i=0;
		nValue=lValue;
		//获取各个位数
		while (nValue)
		{
			digit[i]=nValue%10;//获得个位数
			i++;  //位数
			nValue=nValue/10;//消去个位数,将十位作为个位
		}

		int flag[10]={5,5,5,5,5,5,5,5,5,5};
		int j=0;

		for (;j<i-1;j++)
		{
			if (digit[j]!=digit[j+1])
			{
				flag[j]=0;
			}else
			{
				flag[j]=1;
			}
		}

		int sum=0,k=0;
		for (;k<j;k++)
		{
			sum=sum+flag[k];
		}
		
		if (sum==0)
		{
			return lValue;
			break;
		}

	} while (true);

}

<C/C++基础>华为2011编程大赛初赛成都赛区试题_第1张图片


字符串匹配

l  问题描述

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

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

l  要求实现函数

int GetMatchSta (const char *ArrStr, constchar *KeyStr)

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

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

【输出】 无

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

l  示例

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

返回: 1

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

返回: 1


(官方提供的答案)

// ConsoleAppGetMatchSta.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "iostream"
int GetMatchStr(const char *ArrStr, const char *KeyStr);

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	char arrstr[]="tommababcabc";
	char keystr[]="t?m*ab*abc";
	cout<<"tommababcabc"<<endl;
	cout<<"t?m*ab*abc"<<endl;
	int flag=0;
	flag=GetMatchStr(arrstr,keystr);
	if (flag==1)
	{
		cout<<"上面两个字符串匹配哦,亲"<<endl;
	}else
	{
		cout<<"很遗憾,两个字符串不匹配!!!"<<endl;
	}
	
	getchar();
	system("pause");
	return 0;
}

int GetMatchStr(const char *ArrStr, const char *KeyStr)
{
	switch (*KeyStr)
	{
	case '\0':
		return (*ArrStr=='\0')? 1:0;
	case '?':
		return (*ArrStr=='\0')? 0:GetMatchStr(ArrStr+1,KeyStr+1);
	case '*':
		return (*ArrStr=='\0')? GetMatchStr(ArrStr,KeyStr+1):
			GetMatchStr(ArrStr+1,KeyStr)|GetMatchStr(ArrStr,KeyStr+1);
	default:
		return (*ArrStr!=*KeyStr)? 0:GetMatchStr(ArrStr+1,KeyStr+1);
	}
}


关于递归

递归与循环是两种不同的解决问题的典型思路。 


递归算法: 

优点:代码简洁、清晰,并且容易验证正确性。(如果你真的理解了算法的话,否则你更晕)
缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理,比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。 



循环算法:
优点:速度快,结构简单。
缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。



递归算法 和循环算法总结
1. 一般递归调用可以处理的算法,也通过循环去解决常需要额外的低效处理 。
2. 现在的编译器在优化后,对于多次调用的函数处理会有非常好的效率优化,效率未必低于循环。
3. 千万要有结束条件



你可能感兴趣的:(数据结构,算法,面试,字符串匹配)