CI1.5 利用字符重复的次数压缩字符

来源:互联网 发布:mac微云如何同步 编辑:程序博客网 时间:2024/05/16 07:59

解法一、使用StringBuffer

public class Main {    public static void main(String[] args) {        String str = "aarrvvh";        System.out.println(compressBetter(str));    }    public static String compressBetter(String str) {        // 检查压缩后的字符是否会变得更长        // 如果变得更长就不需要做压缩操作了,此处单列了出来        int size = countCompression(str);        if (size > str.length()) {            return str;        }        StringBuilder mystr = new StringBuilder();        char last = str.charAt(0);        int count = 1;        for (int i = 1; i < str.length(); i++) {            if (str.charAt(i) == last) {                count++;            } else {                mystr.append(last);                mystr.append(count);                last = str.charAt(i);                count = 1;            }        }        mystr.append(last);        mystr.append(count);        return mystr.toString();    }    public static int countCompression(String str) {        if (str == null | str.isEmpty())            return 0;        char last = str.charAt(0);        int size = 0;        int count = 1;        for (int i = 1; i < str.length(); i++) {            if (str.charAt(i) == last) {                count++;            } else {                last = str.charAt(i);                size += 1 + String.valueOf(count).length();                count = 1;            }        }        size += 1 + String.valueOf(count).length();        return size;    }}

采用StringBuffer时间复杂度是n,使用String则是n^2

解法二、如果不能使用StringBuffer

    public static String compressAlternate(String str){        int size = countCompression(str);        if(size >= str.length()){            return str;        }        char[] array = new char[size];        int index = 0;        char last = str.charAt(0);        int count = 1;        for(int i = 1; i < str.length(); i++){            if(str.charAt(i) == last)                count++;            else{                index = setChar(array, last,index,count);                last = str.charAt(i);                count = 1;            }        }         index = setChar(array,last,index,count);        return String.valueOf(array);    }    static int setChar(char[] array, char c, int index, int count){        array[index] = c;        index++;        char[] cnt = String.valueOf(count).toCharArray();        for(char x : cnt){            array[index] = x;            index++;        }        return index;    }
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 网贷名字忘了怎么办 附件太大邮件发不出去怎么办 孩子出生足印单子丢了怎么办 保险名字写错了怎么办 行驶证和身份证名字不一样怎么办 上户后发现合格证和车不一样怎么办 新车上户重量不一样怎么办 医保卡和身份证名字不一样怎么办 保险标志保险卡都没给怎么办 新买的电动自行车不符合标准怎么办 电费的户号12位怎么办? 买到过期的药品怎么办 淘宝代销宝贝信息不全怎么办 en和eng读不明显怎么办 快递收件人填错手机号没收到怎么办 快递收件人电话写错了怎么办 收件人电话写错了怎么办 大货要出货了数量错误怎么办 手被烫伤留疤怎么办 cbg被下单不能改价怎么办 浪琴手表日期中午跳怎么办 社保一体卡丢失了怎么办 京东付款七天不发货怎么办 电动车电机锁钥匙丢了怎么办 电瓶车锁钥匙丢了怎么办 苹果平板ld忘了怎么办 平板版本太低6.0怎么办 ios平板版本太低怎么办 微信公众号重名怎么办 发票规格型号填错了怎么办 鲁大师检测硬盘有问题怎么办 英文成绩单翻译错了怎么办 川航订机票名字写错了怎么办 亚航电子登机牌没有保存怎么办 cfa考试准考证名字有错怎么办 火车票护照号错了怎么办 国际机票名字错一个字怎么办 国际机票名字拼音错了怎么办 订机票名字写错了怎么办 亚航机票护照号写错怎么办 打发过了的奶油怎么办?