面试题整理 8 字符串排序扩展题
2014-03-03 14:21
239 查看
《剑指offer》扩展题,
(1)求字符串所有字符的组合
分析:同样采取分治的思想,如果输入n个字符,则可以构成长度为1、2...n的组合。在n个字符求长度为m的组合时,可以分解为第一个字符和其余的所有字符;如果组合包含第一个字符,则下一步从剩余的字符里选取m-1个字符;如果组合不包含第一个字符,则下一步从剩余的字符里选取m个字符。采用递归的方式解决。
代码:自己写的代码
(2)输入一个包含8个数字的数组,判断有没有可能把这8个数字分别放在正方体的8个顶点上,使得正方体的三个向对面的4个顶点的和都相等。
分析:首先将8个数字排序,然后判断每个排序的数组是否满足条件。
(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; }
相关文章推荐
- 应聘网站编辑常见面试题
- 前端程序员容易忽视的一些基础知识
- [程序员知识]一些“不正规”的软件项目招标前小技巧
- 程序员永远的痛之字符编码
- “德问”高知程序员社群问答解答(语言编程部分)
- 1.5万人进场求职,26%的人找到工作
- 最新百度 阿里 华为 腾讯 谷歌面试笔试题及解析
- (转载)算法面试题
- A__K 面试题
- 线程面试题目
- 程序员面试题-火柴棍式-火车运煤
- 面试总结——字符串
- android面试题 不单单为了面试也是一次很好的学习
- 新鲜出炉的百度js面试题
- 不开辟用于交换数据的临时空间,如何完成字符串的逆序(在技术一轮面试中,有些面试官会这样问)
- 【java面试题】Java面试宝典2013版(超长版)
- 【Java面试题】抽象类是否可继承实体类
- 黑马程序员-Java多线程之线程池初学
- 面试题整理8 字符串的排列
- 黑马程序员-C#基础学习-常用快捷键