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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© skill20 中级黑马   /  2014-5-17 14:16  /  1546 人查看  /  2 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
  压缩规则:
  1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
  2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"

  要求实现函数:
  void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);

  【输入】 pInputStr:  输入字符串
           lInputLen:  输入字符串长度         
  【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

  【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

  示例
  输入:“cccddecc”   输出:“3c2de2c”
  输入:“adef”     输出:“adef”
  输入:“pppppppp” 输出:“8p”

___________________________________________________________________________________________
这个是我用的方法,用了正则表达式。好像也可以实现。
  1. public static String count(String str){
  2.                 //定义获取叠词的规则。
  3.                 String regex = "(.)\\1+";
  4.                 Pattern p = Pattern.compile(regex);
  5.                 Matcher m = p.matcher(str);
  6.                 while(m.find()){
  7.                         //获取叠词。
  8.                         String s = m.group();
  9.                         //把叠词替换。
  10.                         str = str.replaceAll(regex,s.length()+ "$1");
  11.                 }
  12.                 return str;
  13.         }
复制代码

2 个回复

倒序浏览
我一写了一个算法。像这种题训练的逻辑思维,尽量用最基本的算法,练练自己的逻辑思维能力。
package com.itheima.array;

import java.util.Scanner;

public class peo {
        private static int count = 0;
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                System.out.println("请输入要编码的字符串");
                Scanner input = new Scanner(System.in);
                String s1 = input.next().trim();
                //为输入的的字符串加上一个空格最为标记。
                String s=s1+" ";
                //记录转码后的字符串。
                String afterS = "";
                for (int j = 0, h = 1; h < s.length(); j++, h++) {
                        if (s.substring(j, h).endsWith(s.substring(h, h + 1))) {
                                count++;

                        } else if(count!=0) {
                                afterS = afterS + (count+1) + s.substring(j, h);
                                count=0;
                        }else{
                                afterS=afterS+s.substring(j,j+1);
                                System.out.println("哈");
                        }
                }
                System.out.println(afterS);
        }

}
回复 使用道具 举报
版主可以详细解释下这里的正则含义吗 "(.)\\1+";   "$1" 初学正则真心求教
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马