A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 自信boy 中级黑马   /  2016-8-19 22:18  /  545 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。
给定一个string iniString为待压缩的串(长度小于等于10000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。
测试样例
"aabcccccaaa"返回:"a2b1c5a3"
"welcometonowcoderrrrr"返回:"welcometonowcoderrrrr"

1 个回复

倒序浏览
本帖最后由 abcdefg11 于 2016-8-20 00:05 编辑

[Java] 纯文本查看 复制代码
public class YaSuoShuZu {
        public static void main(String[] args){
                        String s="welcometonowcoderrrrr";
                if(judgeS(s)!=0)                
                        System.out.println(jieYaSuo(s));
                if(judgeS(s)==0)                        
                        System.out.println(yaSuo(s));
        }
        public static int judgeS(String s){
                char[] temp=new char[s.length()];//同样的先变char数组
                for(int i=1;i<s.length();i++){//按照压缩规律第一位不可能是数字,所以从1开始,懒得return-1了
                        temp[i]=s.charAt(i);
                        if(temp[i]>48&&temp[i]<=57)return i;
                }
                return 0;
                //变完了
        }//        !=0是已压缩数组.==0是未压缩数组
        public static String yaSuo(String s){
                char[] temp=new char[s.length()];
                for(int i=0;i<s.length();i++){
                        temp[i]=s.charAt(i);
                }
                int count_temp=1;//初始化为1,因为调用的时候已经有一个了
                String s_ok="";
                char a=temp[0];//a先给第一个字符,省事
                for(int i=0;i<s.length()-1;i++){
                        if(temp[i]==temp[i+1]){//如果等于下一个字符,则字符存下,且count_temp+1
                                count_temp++;
                        }else{
                                a=temp[i];
                                if(count_temp>1)s_ok+=a+""+count_temp;
                                if(count_temp==1)s_ok+=a;
                                count_temp=1;
                        }        
                }
                if(count_temp!=1)s_ok+=temp[s.length()-1]+""+count_temp;//如果最后是重复的,还得把数字加上
                if(count_temp==1)s_ok+=temp[s.length()-1];//不重复好说,只加最后一个
                return s_ok;
        }
        public static String jieYaSuo(String s){
                char[] temp=new char[s.length()];//同样的先变char数组
                for(int i=0;i<s.length();i++){
                        temp[i]=s.charAt(i);
                }
                //变完了
                String s_ok=temp[0]+"";//防止下标越界,从1开始
                for(int i=1;i<s.length();i++){
                        if(temp[i]>48&&temp[i]<=57){//如果是数字,就重复这么多次
                                for(int j=0;j<temp[i]-49;j++){//j本来就要执行一次,所以要多减一
                                        s_ok+=temp[i-1];
                                }
                        }else{
                                s_ok+=temp[i];
                        }
                }
                return s_ok;
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马