给你四种方法:第一种:
- #include <iostream>
- #include <iomanip>
- #include <limits>
- using namespace std;
- void swap_star(char& a, char& b){
- char t;
- t = a;
- a = b;
- b = t;
- }
- int main()
- {
- char star[] = "ab**cd**e*12";
- cout << " star : " << star << endl;
- int sz = sizeof(star);
- int starpos = sz - 2;
- int nonstar = sz - 2;
- int cnt = 0;
- while(starpos >= 0 && nonstar >= 0){
- while(star[starpos] != '*' && starpos > 0){ //从末位开始查找‘*’的索引
- --starpos;
- }
- if(starpos > 0){ // 计算非‘*’字符的起始索引,与‘*’一样,倒序搜索,因为要求不改变原非‘*’字符的顺序
- if(starpos > nonstar){
- nonstar = nonstar - 1;
- }else{
- nonstar = starpos - 1;
- }
- }else{ // 如果‘*’索引到了 0, 则说明已交换顺序完毕
- break;
- }
- while(star[nonstar] == '*' && nonstar > 0){ // 找到待交换非‘*’字符索引
- --nonstar;
- }
- if(star[nonstar] != '*' && nonstar >= 0){
- swap_star(star[starpos],star[nonstar]);
- starpos = starpos - 1;
- }else{
- cnt = starpos + 1; // 交换完毕,‘*’字符的索引是从0开始的最后一个‘*’字符的索引
- break;
- }
- }
- cout << "finally : " << star << " star number : " << cnt << endl;
- return 0;
- }
复制代码 第二种:
- #include <iostream>
- using namespace std;
- void movStar(char* p)
- {
- int len = strlen(p);
- int i;
- for (i = len-1; p[i]!='*';i--); //从后向前找到第一个'*',然后开始覆盖。
- int j = i;
- for (;i >= 0; i--)
- {
- if (p[i]!='*')
- {
- p[j--]=p[i];
- }
- }
- while(j>=0)
- {
- p[j--]='*';
- }
- }
- int main()
- {
- char p[]="ab**cd**e*12";
- cout<<p<<endl;
- movStar(p);
- cout<<p<<endl;
- }
复制代码 第三种:
- #include <iostream>
- using namespace std;
- void swap(char* p, char* q)
- {
- int temp = *p;
- *p = *q;
- *q = temp;
- }
- int movStar(char* p, int n)
- {
- char* q1 = p+n-1, *q2 = p+n-1;
- while (q1 > p)
- {
- while (*q2 != '*')
- q2--;
- q1 = q2-1;
- while (*q1 == '*')
- q1--;
- swap(q1, q2);
- cout<<p<<endl;
- }
- return q2-q1+1;
- }
- int main()
- {
- char p[]="ab**cd**e*12";
- int cnt = movStar(p,strlen(p));
- cout<<"after movStar..."<<endl;
- cout<<"number of * is: "<<cnt<<endl;
- cout<<p<<endl;
- }
复制代码 第四种:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- void swap(char* str,int i,int j)
- {
- if(str[i] != str[j])
- {
- str[i]^=str[j];
- str[j]^=str[i];
- str[i]^=str[j];
- }
- }
- int departStars(char *str)
- {
- //k停留在其它字母上
- int len,i,k,cout=0;
- if(str==NULL) return 0;
- if((len=strlen(str)) < 1) return 0;
- i=k=len-1;
- while(i>=0)
- {
- if(str[i]!='*')
- {
- swap(str,i--,k--);
- }
- else
- {
- --i;
- ++cout;
- }
- }
- return cout;
- }
- int main(void) {
- char str[]="*ABCD*D*BSD**d**";
- printf("%d %s",departStars(str),str);
- return 0;
- }
复制代码
|