A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 薛旻 中级黑马   /  2014-3-3 17:25  /  754 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

     编码完成下面的处理函数。函数将字符串中的字符“*”移动到串的前部分,前面的非“*”字符后移,但不能改变非“*”字符的先后顺序,函数返回串中字符“*”的数量。如原始串为:ab**cd**e**12,处理后为******abcde12,且函数返回值为5(要求使用尽量少的时间和辅助空间)
     贴出自己程序的运行时间。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

3 个回复

倒序浏览
获取长度len1,删除所有*
获取长度len2,在开始位置添加*
返回len2-len1

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
楼主我给你写了一个,你看看是不是你要的,你可以自己再改一下

  1. public class Number {
  2.         public static void main(String[] args) {
  3.                 StringBuilder sb = new StringBuilder("ab**cd**e**12");
  4.                 StringBuilder key = new StringBuilder(sb.length());
  5.                 int num = 0;
  6.                 for (int i = 0; i < sb.length(); i++) {
  7.                         if ('*' != sb.charAt(i)) {
  8.                                 key.append(sb.charAt(i));
  9.                         } else {
  10.                                 num++;
  11.                         }
  12.                 }
  13.                 key = key.reverse();
  14.                 for (int i = 0; i < num; i++) {
  15.                         key.append('*');
  16.                 }
  17.                 System.out.println(key.reverse());
  18.                 System.out.println(num);

  19.         }

  20. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
给你四种方法:第一种:
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <limits>

  4. using namespace std;
  5. void swap_star(char& a, char& b){
  6.         char t;
  7.         t = a;
  8.         a = b;
  9.         b = t;
  10. }


  11. int main()
  12. {
  13.         char star[] = "ab**cd**e*12";
  14.         cout << " star : " << star << endl;
  15.         int sz = sizeof(star);
  16.         int starpos = sz - 2;
  17.         int nonstar = sz - 2;
  18.         int cnt = 0;
  19.         while(starpos >= 0 && nonstar >= 0){
  20.                 while(star[starpos] != '*' && starpos > 0){ //从末位开始查找‘*’的索引
  21.                         --starpos;
  22.                 }
  23.                 if(starpos > 0){  // 计算非‘*’字符的起始索引,与‘*’一样,倒序搜索,因为要求不改变原非‘*’字符的顺序
  24.                         if(starpos > nonstar){
  25.                                 nonstar = nonstar - 1;
  26.                         }else{
  27.                                 nonstar = starpos - 1;
  28.                         }
  29.                 }else{  // 如果‘*’索引到了 0, 则说明已交换顺序完毕
  30.                         break;
  31.                 }
  32.                 while(star[nonstar] == '*' && nonstar > 0){ // 找到待交换非‘*’字符索引
  33.                         --nonstar;
  34.                 }
  35.                 if(star[nonstar] != '*' && nonstar >= 0){
  36.                         swap_star(star[starpos],star[nonstar]);                       
  37.                         starpos = starpos - 1;
  38.                 }else{
  39.                         cnt = starpos + 1;  // 交换完毕,‘*’字符的索引是从0开始的最后一个‘*’字符的索引
  40.                         break;
  41.                 }
  42.         }

  43.         cout << "finally : " << star <<  " star number : " << cnt << endl;

  44.         return 0;
  45. }
复制代码
第二种:
  1. #include <iostream>
  2. using namespace std;

  3. void movStar(char* p)
  4. {
  5.         int len = strlen(p);
  6.         int i;
  7.         for (i = len-1; p[i]!='*';i--);        //从后向前找到第一个'*',然后开始覆盖。
  8.         int j = i;
  9.         for (;i >= 0; i--)
  10.         {
  11.                 if (p[i]!='*')
  12.                 {
  13.                         p[j--]=p[i];
  14.                 }
  15.         }
  16.         while(j>=0)
  17.         {
  18.                 p[j--]='*';
  19.         }
  20. }

  21. int main()
  22. {
  23.         char p[]="ab**cd**e*12";  
  24.         cout<<p<<endl;
  25.         movStar(p);
  26.         cout<<p<<endl;
  27. }
复制代码
第三种:

  1. #include <iostream>
  2. using namespace std;

  3. void swap(char* p, char* q)
  4. {
  5.         int temp = *p;
  6.         *p = *q;
  7.         *q = temp;
  8. }

  9. int movStar(char* p, int n)
  10. {
  11.         char* q1 = p+n-1, *q2 = p+n-1;
  12.         while (q1 > p)
  13.         {
  14.                 while (*q2 != '*')
  15.                         q2--;
  16.                 q1 = q2-1;
  17.                 while (*q1 == '*')
  18.                         q1--;
  19.                 swap(q1, q2);
  20.                 cout<<p<<endl;
  21.         }
  22.         return q2-q1+1;
  23. }


  24. int main()
  25. {
  26.         char p[]="ab**cd**e*12";
  27.         int cnt = movStar(p,strlen(p));
  28.         cout<<"after movStar..."<<endl;
  29.         cout<<"number of * is: "<<cnt<<endl;
  30.         cout<<p<<endl;
  31. }
复制代码
第四种:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void swap(char* str,int i,int j)
  5. {
  6.         if(str[i] != str[j])
  7.         {
  8.                 str[i]^=str[j];
  9.                 str[j]^=str[i];
  10.                 str[i]^=str[j];
  11.         }
  12. }
  13. int departStars(char *str)
  14. {
  15.         //k停留在其它字母上
  16.         int len,i,k,cout=0;
  17.         if(str==NULL) return 0;
  18.         if((len=strlen(str)) < 1) return 0;
  19.         i=k=len-1;
  20.         while(i>=0)
  21.         {
  22.                 if(str[i]!='*')
  23.                 {
  24.                         swap(str,i--,k--);
  25.                 }
  26.                 else
  27.                 {
  28.                         --i;
  29.                         ++cout;
  30.                 }
  31.         }
  32.         return cout;
  33. }
  34. int main(void) {
  35.         char str[]="*ABCD*D*BSD**d**";
  36.         printf("%d %s",departStars(str),str);
  37.         return 0;
  38. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马