例题1: 排列字符串问题
/*
* 把一个0-1串排序,交换任意两个位置,求交换的次数;
* 分析: 此过程与快速排序法的patition过程类似,如果左边是
* 0,则继续往后数,直到遇到1,如果右边是1,则往前数,直到遇到0
*/
#include<iostream>
using namespace std;
void main()
{
int A[10]={0,1,1,1,1,1,0,1,1,1};
int answer=0;
for(int i=0,j=9;i<j;++i,--j)
{
for(; (i<j)&&(A[i]==0);++i);
for(; (j>i)&&(A[j]==1);--j);
if(i<j)
{
answer++;
}
}
cout<<answer<<endl;
}
其时间复杂度为线性;
例题2 : 替换字符串
/*
* 删除一个空间中所有的a,并复制所有的b;字符数组空间足够大
* 分析:先删除a,利用原来的字符串的空间
* 在复制b,这时字符串要加长;
*/
#include<iostream>
using namespace std;
void main()
{
char a[] = {'a', 'b','c','b','a','b','c','a'};
int len = sizeof(a)/sizeof(a[0]);
//cout<<len<<endl;
//删除'a',利用原来字符串的空间
int n=0, numb=0;
for(int i=0; i<len; ++i)
{
if(a[i]!='a'){
a[n++]=a[i];
}
if(a[i]=='b'){
++numb;//统计b的个数
}
}
cout<<numb<<" "<<n<<endl;
a[n]=0;
//复制所有的b,计算b的个数,倒着复制
int nlen= n+numb; //新字符串的长度
a[nlen] = 0;
for(int i=nlen-1, j=n-1; j>=0;--j)
{
a[i--]=a[j];
if(a[j]=='b'){
a[i--] = 'b';
}
}
for(int i=0; i<nlen; i++)
{
cout<<a[i];
}
}
例题3 : 倒序
/*
* 倒序;
*/
#include<iostream>
using namespace std;
void main()
{
char a[] = {'a', 'b','c','b','a','b','c','a'};
int len = sizeof(a)/sizeof(a[0]);
int i=0,j=len-1;
while(i<j)
{
char temp=a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
for(int i=0; i<len; i++)
{
cout<<a[i];
}
}