面试题整理 8 字符串排序扩展题
生活随笔
收集整理的這篇文章主要介紹了
面试题整理 8 字符串排序扩展题
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
《劍指offer》擴(kuò)展題,
(1)求字符串所有字符的組合
? 分析:同樣采取分治的思想,如果輸入n個(gè)字符,則可以構(gòu)成長度為1、2...n的組合。在n個(gè)字符求長度為m的組合時(shí),可以分解為第一個(gè)字符和其余的所有字符;如果組合包含第一個(gè)字符,則下一步從剩余的字符里選取m-1個(gè)字符;如果組合不包含第一個(gè)字符,則下一步從剩余的字符里選取m個(gè)字符。采用遞歸的方式解決。
代碼:自己寫的代碼
//求字符串的所有組合 void Combination(char* pStr) {if( pStr == NULL ){return;}int nLength = strlen(pStr);if(nLength == 0){return;}//分別是1-nLength個(gè)字符的組合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 -- 源字符串的當(dāng)前位置 // m -- 從字符串中選取m個(gè)字符 // comStr -- 組合字符串當(dāng)前位置 // 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;//不選擇當(dāng)前元素Combination(pStr+1,m,comStr,resultStr);//選擇當(dāng)前元素*tempComStr = *pStr;m -= 1;Combination(pStr+1,m,tempComStr+1,resultStr);} }(2)輸入一個(gè)包含8個(gè)數(shù)字的數(shù)組,判斷有沒有可能把這8個(gè)數(shù)字分別放在正方體的8個(gè)頂點(diǎn)上,使得正方體的三個(gè)向?qū)γ娴?個(gè)頂點(diǎn)的和都相等。
????分析:首先將8個(gè)數(shù)字排序,然后判斷每個(gè)排序的數(shù)組是否滿足條件。
//是否滿足條件的標(biāo)志 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; }
總結(jié)
以上是生活随笔為你收集整理的面试题整理 8 字符串排序扩展题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试题整理8 字符串的排列
- 下一篇: 动态链接库和静态库的区别