51、放鱼问题
题目:将20条鱼放入10个桶中,每个桶可以放0~10条,总共有多少种方法。
int Function(int NumOfBox,int NumOfFish,int max)
{
if(NumOfBox==0 || NumOfFish==0 || (NumOfBox==1&&NumOfFish>10))
return 0;
if(NumOfBox==1&&NumOfFish<=10)
return 1;
int ret = 0;
for(int i=0;i<=max && i<=NumOfFish;++i)
{
ret+=Function(NumOfBox-1,NumOfFish-i,max);
}
//cout<<ret<<endl;
return ret;
}
int main()
{
cout<<Function(10,20,10)<<endl;
return 0;
}
52、最长回文子串
题目:写一个函数,返回一个字符串中最长回文字串的长度。
int LongestPalindrome(char* str,int length)
{
if(str==NULL || length<0)
return -1;
if(length==0 || length==1)
return length;
int maxNum = 1;
char* left = NULL;
char* right = NULL;
for(int i = 0;i!=length-1;++i)
{
//子串奇数的情况
left = str+i;
right = str+i;
while (left>=str && right<=str+length-1)
{
if(*left==*right)
{
--left;
++right;
}
else break;
}
if(right-left-1>maxNum)
maxNum = right-left-1;
//子串偶数的情况
left = str+i;
right = str+i+1;
if(*left == *right)
{
while (left>=str && right<=str+length-1)
{
if(*left==*right)
{
--left;
++right;
}
else break;
}
}
if(right-left-1>maxNum)
maxNum = right-left-1;
}
return maxNum;
}
53、N对括号的所有合法排列
题目:给定N对括号,输出其所有的合法的组合状态,例如,N=3,所有的合法状态为:"((()))”, “(()())”, “(())()”, “()(())”, “()()()”。
char myArray[100]={0};
void Helper(int n,int left,int right);
void PrintAllTheBrackets(int n)
{
if(n<1)
return;
Helper(n,0,0);
}
void Print(char* a,int length)
{
if(a==NULL && length<1)
return;
for (int i = 0;i!=length;++i)
cout<<*(a+i);
cout<<endl;
}
void Helper(int n,int left,int right)
{
if(left==n && right==n)
{
Print(myArray,n*2);
return;
}
int index = left + right;
if(left<n)
{
myArray[index] = '(';
Helper(n,left+1,right);
}
if(right<left)
{
myArray[index] = ')';
Helper(n,left,right+1);
}
}
int main()
{
PrintAllTheBrackets(3);
return 0;
}
54、定长线段最多覆盖点的个数
题目:给定一系列x轴的点坐标,例如 1,3,7,8,9,11这些坐标升序放在数组中,现在给一根绳子,长度为4,问绳子最多能覆盖的点数有多少,例如绳子放前面只能覆盖两个点,1,3,如果放后面能覆盖4个点。
int CountDots(int* a,int arrayLength,int ropeLength)
{
if(a==NULL || arrayLength<1 || ropeLength<0)
return -1;
int* first = a;
int* second = a;
int ret = 1;
while (second<a+arrayLength)
{
if(ropeLength>=*second-*first)
{
if(second-first+1>ret)
ret = second-first+1;
++second;
}
else
++first;
}
return ret;
}
int main()
{
int a[] = {1,3,7,8,9,11};
cout<<CountDots(a,6,4)<<endl;
return 0;
};
55、最大连续数字串
题目:完成函数:int maxnumstr(char *inputstr, char *outputstr)
函数功能:找出inputstr中的最长连续数字串存储到outputstr里并返回长度,如调用maxnumstr("123abc1234a",
outputstr)后返回4且outputstr中为"1234"。
函数功能:找出inputstr中的最长连续数字串存储到outputstr里并返回长度,如调用maxnumstr("123abc1234a",
outputstr)后返回4且outputstr中为"1234"。
int maxnumstr(char *inputstr, char *outputstr)
{
if(inputstr==NULL || outputstr==NULL)
return -1;
int ret = 0;
int count = 0;
char* maxstart=NULL;
char* temp = NULL;
for (char* iter = inputstr;*iter!='\0';++iter)
{
if(*iter>='0'&&*iter<='9')
{
++count;
if(temp==NULL)
temp = iter;
}
else
{
if(count>ret)
{
ret = count;
count=0;
maxstart = temp;
temp = NULL;
}
}
}
if(maxstart!=NULL)
for (int i = 0;i!=ret;++i)
*outputstr++=*maxstart++;
*outputstr='\0'; //这句代码不能遗漏!
return ret;
}
int main()
{
//测试用例
char *inputstr = "hello123world456789over1245664mm";
char *outputstr = (char*)malloc(50);
memset(outputstr,0,50);
int count = maxnumstr(inputstr,outputstr);
printf("The longest digital string is: ");
puts(outputstr);
printf("The length is: %d\n",count);
free(outputstr);
system("pause");
return 0;
}
56、二重哥德巴赫猜想
题目:
每个不小于6的偶数都可以表示为两个素数之和
编写一个函数,输出6-100000内所有偶数可以表示为哪两个素数之和,如果一个偶素有多种表示方式,输出任意一种即可。
bool IsPrime(int num)
{
for(int i=2;i<=sqrt(static_cast<double>(num));++i)
if(!(num%i))
return false;
return true;
}
void Judge(int even)
{
for(int i=1;i!=even/2;++i)
if(IsPrime(i)&&IsPrime(even-i))
cout<<even<<" "<<i<<" + "<<even-i<<endl;
}
void Print()
{
for (int i =6;i!=1000;i+=2)
Judge(i);
}
57、打印回环矩阵(网易)
void Print(int n)
{
if(n<1)
return;
int* arr = new int[n*n];
arr[0] = 1;
int i = 0; //行
int j = 1; //列
int value = 2; //数值
for(int limit = 2;limit<=n;++limit)
{
if(!(limit&1))//偶数行,先向下,再向左。
{
while (i!=limit)
{
arr[n*i+j]=value++;
cout<<n*i+j<<endl;
++i;
}
--i;
--j;
while (j>=0)
{
arr[n*i+j]=value++;
--j;
}
++j;
++i;
}
else //奇数行,先向右,再向上。
{
while (j!=limit)
{
arr[n*i+j]=value++;
++j;
}
--j;
--i;
while (i>=0)
{
arr[n*i+j]=value++;
--i;
}
++i;
++j;
}
}
for(int i=0;i!=n;++i)
{
for(int j=0;j!=n;++j)
cout<<arr[n*i+j]<<" ";
cout<<endl;
}
}
58、表达式求值(网易)
一个字符串只由'+','-',和‘0’-‘9’组成,并且'+','-'只作为二元运算符。
bool calculate(const char* exp, int &result);
bool calculate(const char* exp, int &result)
{
if(exp==NULL)
return false;
char opera;
int temp;
result = *exp++-'0';
while(*exp!='\0')
{
opera = *exp++;
temp = *exp++-'0';
if(opera=='+')
result+=temp;
else
result-=temp;
}
return true;
}
59、另一种回环矩阵的显示(网易)
int Print(int x,int y)
{
if(x==0 && y==0)
return 1;
bool isPlus=true; //递增或递减标识符
int count = 1; //每次递增或递减次数
int num = 1; //返回值
int i=0; //行
int j=0; //列
while(true)
{
if(isPlus)
{
for(int m =0;m!=count;++m)
{
++i;
++num;
if(i==x && j==y)
return num;
}
for(int m =0;m!=count;++m)
{
++j;
++num;
if(i==x && j==y)
return num;
}
++count;
isPlus = false;
}
else
{
for(int m =0;m!=count;++m)
{
--i;
++num;
if(i==x && j==y)
return num;
}
for(int m =0;m!=count;++m)
{
--j;
++num;
if(i==x && j==y)
return num;
}
++count;
isPlus = true;
}
}
}
60、输出程序自身
题目:输出程序自身源代码
//输出程序自身
ifstream ifile("1.cpp");
string s;
if(ifile)
{
while (getline(ifile,s))
cout<<s<<endl;
}
else
cout<<"不能打开文件!";