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

《剑指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;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值