一、题目
编写一个函数void strcompress(char *s),输入一个字符串(只包含小写字母和空格,且长度小于1000),然后采用如下的规则对该字符串当中的每一个字符进行压缩:
(1) 如果该字符是空格,则保留该字符。
(2) 如果该字符是第1次出现或第3次出现或第6次出现,则保留该字符。
(3) 否则,删除该字符。
例如,若用户输入occurrence,经过压缩后,字符c的第2次出现被删除,第1和第3次出现仍保留;字符r和e的第2次出现均被删除,因此最后的结果为:ocurenc。
编写main函数测试该函数的正确性。
输入:
occurrence
输出:
ocurenc
二、思路
在本题中只想保留一个字符串中字符出现第一次、第三次、第六次以及所有的空格
也就是删除一个字符串中字符出现次数的第二次、第四次以及第五次...
所以可以想到运用HashMap进行求解
将字符与其出现次数一一对应
当当前字符为此字符在字符串中出现的第二次、第四次以及第五次...将其删除
删除的过程运用StringBuilder创建一个原字符串的复制体
在循环遍历原字符串的过程中将 字符--次数 存入HashMap中
一旦发现当前字符为需要删除的字符
就将这个字符在StringBuilder中删除掉
三、代码实现
import java.util.HashMap;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
compressString(str);
}
public static void compressString(String str){
StringBuilder sb = new StringBuilder(str);
HashMap<Character,Integer> map= new HashMap<>();//hashmap 存储字符-次数
for(int i = 0,j = 0;i < str.length(); i++,j++){
Character c = str.charAt(i);
if(!map.containsKey(c))
map.put(c,1);//如果当前没有这个字符 就将这个字符放入 存入格式为c-1
else
map.put(c,map.get(c) + 1);//如果有这个字符 就加1 c-2
if(map.get(c) != 1 && map.get(c) != 3 && map.get(c) != 6 && c != ' '){
sb.deleteCharAt(j--);//如果保留的条件均不符合 就删除这个字符
}
}
System.out.println(sb);
}
}
四、问题
代码测试过程中,只是测试了所给样例,在起初我的字符串读入用了sc.next()方法导致最后练习系统上得了20分。
next()读入会自动将空格省略
导致出错
五、总结
在字符串读入时一定要用nextLine()而不是next(),否则会导致字符串内容损失。