zoukankan      html  css  js  c++  java
  • 考试第三题

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

  • 相关阅读:
    linux拷贝文件右键无粘贴功能
    Talk is cheap,show me the code!
    wireshark 分析mptcp序列号
    wireshark提取cwnd的语句
    (转)Wireshark查看重传包对应关系
    如何在Virtualbox中对Linux(Ubuntu)系统根分区扩容
    ns2中gnuplot不显示图像解决方法
    直接检测拥塞窗口大小的Tcpprobe
    mininet monitor
    mininet Red-ecn
  • 原文地址:https://www.cnblogs.com/bichen-01/p/11336519.html
Copyright © 2011-2022 走看看