名企招聘经典面试编程题集锦[第51-60题]

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"。

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!='';++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='';   //这句代码不能遗漏!
	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
",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!='')
	{
		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<<"不能打开文件!";


原文地址:https://www.cnblogs.com/javawebsoa/p/3202995.html