首页 > 其他 > 详细

面试题整理 8 字符串排序扩展题

时间:2014-03-04 05:15:29      阅读:420      评论:0      收藏:0      [点我收藏+]

《剑指offer》扩展题,

(1)求字符串所有字符的组合

  分析:同样采取分治的思想,如果输入n个字符,则可以构成长度为1、2...n的组合。在n个字符求长度为m的组合时,可以分解为第一个字符和其余的所有字符;如果组合包含第一个字符,则下一步从剩余的字符里选取m-1个字符;如果组合不包含第一个字符,则下一步从剩余的字符里选取m个字符。采用递归的方式解决。


代码:自己写的代码

//求字符串的所有组合
void Combination(char* pStr)
{
	if( pStr == NULL )
	{
		return;
	}
	 
	int nLength = strlen(pStr);
	if(nLength == 0)
	{
		return;
	}
	//分别是1-nLength个字符的组合
	for( int i=1; i<=nLength; ++i)
	{
		char* resultStr = new char[i+1]; //注意空出一位放‘\0‘
		char* comStr = resultStr;
		Combination( pStr,i,comStr,resultStr);
		delete[] resultStr;
	}
}
// pStr -- 源字符串的当前位置
// m  -- 从字符串中选取m个字符
// comStr -- 组合字符串当前位置
// resultStr -- 组合字符串首地址

void Combination(const char* pStr, int m, char* comStr, char* resultStr)
{
   if( m==0 )
   {
	   *comStr = ‘\0‘;
	   printf("%s\n",resultStr);
	   return;
   }
   
   if( strlen(pStr) != 0 )
   {
	   if( *(pStr+1)==‘\0‘ && m==1 )
	   {
			*comStr = *pStr;
			*(comStr+1) = ‘\0‘;
			printf("%s\n",resultStr);
			return;
	   }

	   char* tempComStr = comStr;

	   //不选择当前元素
	   Combination(pStr+1,m,comStr,resultStr);

	   //选择当前元素
	   *tempComStr = *pStr;
	   m -= 1;
	   Combination(pStr+1,m,tempComStr+1,resultStr);
   }
}

(2)输入一个包含8个数字的数组,判断有没有可能把这8个数字分别放在正方体的8个顶点上,使得正方体的三个向对面的4个顶点的和都相等。

    分析:首先将8个数字排序,然后判断每个排序的数组是否满足条件。

//是否满足条件的标志
bool isExist = false;
int existNum = 0;

void GetCommutation( const int data[], int* dataPosition, int nLength)
{
	if( nLength==0 )
	{
		/*for( int i=0; i<8; ++i )
		{
		printf("%d\t",data[i]);
		}
		printf("\n");*/

		int sum1 = data[0]+data[1]+data[2]+data[3];
		int sum2 = data[4]+data[5]+data[6]+data[7];
		if( sum1==sum2 )
		{
			int sum3 = data[0]+data[3]+data[4]+data[7];
			int sum4 = data[1]+data[2]+data[5]+data[6];
			if( sum3==sum4 )
			{
				int sum5 = data[2]+data[3]+data[4]+data[5];
				int sum6 = data[0]+data[1]+data[6]+data[7];
				if( sum5==sum6 )
				{
					//return true;
					++ existNum;
					isExist = true;
					printf("No.%d is as follow: \n",existNum);
					for( int i=0; i<8; ++i )
					{
						printf("%d\t",data[i]);
					}
					printf("\n");
				}
			}
		}
		//return false;
	}
	for( int i=0; i< nLength; ++i )
	{
		if( i==0 )
		{
			GetCommutation(data,dataPosition+1,nLength-1);
			continue;
		}

		int temp = dataPosition[i];
		dataPosition[i] = dataPosition[0];
		dataPosition[0] = temp;

		GetCommutation( data,dataPosition+1,nLength-1);

		temp = dataPosition[i];
		dataPosition[i] = dataPosition[0];
		dataPosition[0] = temp;
	}
}
// 正方体问题
bool IsEqualOf3OppositeSum(const int data[],int nLength)
{
	isExist = false;
	if( data==NULL || nLength != 8)
	{
		return isExist;
	}
	int* dataPosition = (int*) data;
	GetCommutation(data,dataPosition,8);
	if(!isExist)
	{
		printf("not exist");
	}
	return isExist;
}



面试题整理 8 字符串排序扩展题,布布扣,bubuko.com

面试题整理 8 字符串排序扩展题

原文:http://blog.csdn.net/kuaile123/article/details/20371379

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!