字符串移动问题

【需求说明】:编码完成下面的处理函数。函数将字符串中的字符"*"移动字符串的前部,前面的非"*"字符后移,但不能改变非"*"字符的先后顺序,函数返回串中字符"*"的数量。如原始串为:ab**cd**e*12,处理后为*****abcde12,且函数返回值为5(要求使用尽量少的时间和辅助空间)。

【需求分析】:本题目的要求是算法时间上最优,关键还要求存储空间上最优,这下那些通过再来几个字符串作为辅助的算法就不能用了,但是我们前面学过很多排序算法!用我们前面所学的排序算法去实现即可!直接进入代码部分:

 1 package sr.string;
 2 
 3 import java.util.Scanner;
 4 
 5 /**
 6  * @author lzj
 7  * @create 2017年10月24日 上午2:22:34
 8  * @describe 字符串移动
 9  * 编码完成下面的处理函数。函数将字符串中的字符"*"
10  * 移动字符串的前部,前面的非"*"字符后移,但不能改
11  * 变非"*"字符的先后顺序,函数返回串中字符"*"的数
12  * 量。如原始串为:ab**cd**e*12,处理后
13  * 为*****abcde12,且函数返回值为5
14  * (要求使用尽量少的时间和辅助空间)。
15  */
16 public class StringMove {
17 
18     public int stringMove(String str) {
19         System.out.println("处理前的字符串为:"+str);
20         char beforStr[] =str.toCharArray();
21         int i,j=beforStr.length-1;
22         for(i=j;j>=0;j--) {
23             if(beforStr[i]!='*') {
24                 i--;
25             }else if(beforStr[j] !='*'){
26                 //如果下标为i的字符为"*"
27                 beforStr[i]=beforStr[j];
28                 beforStr[j]='*';
29                 i--;
30             }
31         }
32         System.out.println("处理后的字符串为:");
33         for(char afterStr : beforStr) {
34             System.out.print(afterStr);
35         }
36         return i+1;
37     }
38     /**
39      * at 2017年10月24日 上午2:22:34 by lzj
40      * @Parameters1 String[] args
41      * @Returns void
42      */
43     public static void main(String[] args) {
44         StringMove m=new StringMove();
45         Scanner input=new Scanner(System.in);
46         System.out.println("请输入字符串:");
47         String str=input.next();
48         int sum=m.stringMove(str);
49         System.out.println("其中*个数为:"+sum);
50     }
51 }

运行结果截图:

如有任何疑问可联系邮箱: 给我发邮件、或直接联系QQ:1584875179 || 点返回首页

原文地址:https://www.cnblogs.com/aeon/p/7721693.html