【需求说明】:编码完成下面的处理函数。函数将字符串中的字符"*"移动字符串的前部,前面的非"*"字符后移,但不能改变非"*"字符的先后顺序,函数返回串中字符"*"的数量。如原始串为: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 }
运行结果截图: