考试第三题
package test03; import java.util.ArrayList; import java.util.List; public class Demo { // 实现压缩字符串 例如AABB -> A2B2 AAABBBC ->A3B3C1 public static void main(String[] args) { // 例如:先存入一个字符串 String strl = "AABBB"; int length = strl.length(); // 先存入集合里 因为集合可以把每个字符的下标都能遍历出来 List<Integer> list = new ArrayList(); // 添加字母下标 for (int i = 0; i < strl.length() - 1; i++) { if (strl.charAt(i) != strl.charAt(i + 1)) { list.add(i); } } // 举例例如: ABC 我上面的方法不能添加到最后一位 只能输出A1B1 C1就不能输出 // 因为最后一位没有可以比较的 所以不满足if条件也就没有添加下标 // 这里我就进行了处理 // 当最后一位没有比的话我就默认把最后一位的下标也添加进入 if (strl.charAt(strl.length() - 1) != strl.charAt(strl.length() - 2)) { list.add(strl.length() - 1); // 结束 是弄BB得这一段 // 但还有情况 就是当倒数第二个和倒数第一个如果相同,那他也不会执行 // 例如 AABB 他就只会执行 A2 而B2不会执行 // 所以再加个判断 } else { list.add(strl.length() - 1); } // 再把AABB变为 A2B2 首先就要把开始的下标和结束下标找出 例如A-start=0 A-end // 返回字符串可以用subString方法 subString方法 下标 数字 // 举例: AABB // 上面存入的字母的下标 list集合里的 // list={1,3}; // 开始(start) 结束(end) // A 0 2 // B 2 4 // start = (1-1) 前面的1 对应的i的下标是0 // list.get(i-1)-1 // start = [(list.get(1-1))-1] // AAABBB list = {2,5}; // A 0 3 // B 3 6 // 找规律: // 开始 = 首次进入 为默认值0 而第二次进入 却发生了改变 // 其实接下去也会发生改变 这里的例子我不再这里写出 可以自己试试(我已经验证过了) // 说明开始进入的第一次也就是i=0的时 要用默认值说明start没有被赋值 // 但接下去的start却又被赋值 可以用if判断 if!=0 满足的才赋值 //AABB A+2 B+2 A: 2-0 b: 4-2 int start = 0; int end = 0; StringBuffer sbf = new StringBuffer(); for (int i = 0; i < list.size(); i++) { //AABB中AA的end 跟BB的end end = list.get(i) + 1; if (i != 0) { //AABB中AA的start BB的start start = list.get(i - 1) + i; } //这步就相当于把AABB中的 AA 提取出来 BB也提取出来 String s = strl.substring(start, end); sbf.append(s.charAt(0)).append(end-start); } // 用charAt(0)方法把 第一个字母都提取出来 变为A+2+B+2 就可以用StringBuffer // 的append追加 System.out.println(sbf); } }