考试第三题

 

 

 

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);
    }

}

 

posted @ 2019-08-11 20:22  AxeBurner  阅读(145)  评论(0编辑  收藏  举报