《剑指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
原文:http://blog.csdn.net/kuaile123/article/details/20371379