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); }
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); }
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. 千万要有结束条件