您的位置:首页 > 职场人生

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

2014-03-03 14:21 239 查看
《剑指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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: