0

我的目标是编写一个压缩字符串的程序,例如:

输入:你好oopppppp!
输出:he2l3o6p!

这是我到目前为止的代码,但有错误。

当我有输入时:hellooo

我的代码输出:hel2l3o

代替:he213o

2被打印在错误的位置,但我不知道如何解决这个问题。

此外,输入:你好

我的代码输出:hel2l

而不是:he2lo

在这种情况下,它会一起跳过最后一个字母,并且 2 也在错误的位置,这是我的第一个示例中的错误。

任何帮助深表感谢。非常感谢!

 public class compressionTime
{
public static void main(String [] args)
{
       System.out.println ("Enter a string");

       //read in user input
       String userString = IO.readString();

       //store length of string
       int length = userString.length();

       System.out.println(length);

       int count;
       String result = "";

        for (int i=1; i<=length; i++)
        {
            char a = userString.charAt(i-1);
            count = 1;

            if (i-2 >= 0) 
            {
                while (i<=length && userString.charAt(i-1) == userString.charAt(i-2)) 
                {
                    count++;

                    i++;
                } 
               System.out.print(count);                 
            }

            if (count==1) 

                result = result.concat(Character.toString(a));
            else 

                result = result.concat(Integer.toString(count).concat(Character.toString(a)));

        }



   IO.outputStringAnswer(result);
}

}

4

7 回答 7

1

我会

  • 从 0 开始计数,因为这就是索引在 Java 中的工作方式。你的代码会更简单。
  • 会将当前字符与一个字符进行比较。这将避免打印第一个字符。
  • 不会压缩ll2l因为它不小。只有至少 3 个的序列会有所帮助。
  • 尝试检测是否使用了一个数字39至少打印一个错误。
  • 使用调试器单步调试代码以了解它在做什么以及为什么它没有按照您认为的那样做。
于 2013-10-29T18:36:53.727 回答
1

我正在这样做。很简单:

public static void compressString (String string) {
    StringBuffer stringBuffer = new StringBuffer();

    for (int i = 0; i < string.length(); i++) {
        int count = 1;
        while (i + 1 < string.length()
                && string.charAt(i) == string.charAt(i + 1)) {
            count++;
            i++;
        }

        if (count > 1) {
            stringBuffer.append(count);
        }

        stringBuffer.append(string.charAt(i));
    }

    System.out.println("Compressed string: " + stringBuffer);
}
于 2015-07-16T02:15:52.613 回答
0

问题是您的代码检查前一个字母而不是下一个字母是否与当前字母相同。

您的for循环基本上遍历字符串中的每个字母,如果它与前一个字母相同,它会计算出该字母的数量并将该数字放入结果字符串中。然而,对于像“hello”这样的词,它会检查“e”和“l”(并注意到它们前面有“h”和“e”,接受性地)并认为没有重复。然后它将到达下一个'l',然后看到它与前一个字母相同。它将在结果中放入“2”,但为时已晚,导致“hel2l”而不是“he2lo”。

要清理和修复您的代码,我建议使用以下方法替换您的for循环:

   int count = 1;
   String result = "";
   for(int i=0;i<length;i++) {
       if(i < userString.length()-1 && userString.charAt(i) == userString.charAt(i+1))
           count++;
       else {
           if(count == 1)
               result += userString.charAt(i);
           else {
               result = result + count + userString.charAt(i);
               count = 1;
           }
       }
   }

如果您需要我解释一些更改,请发表评论。有些是必要的,有些是可选的。

于 2013-10-29T18:43:17.440 回答
0

如果你不明白它是如何工作的,你应该学习正则表达式。

public String rleEncodeString(String in) {
    StringBuilder out = new StringBuilder();
    Pattern p = Pattern.compile("((\\w)\\2*)");
    Matcher m = p.matcher(in);

    while(m.find()) {
        if(m.group(1).length() > 1) {
            out.append(m.group(1).length());
        }
        out.append(m.group(2));
    }

    return out.toString();
}
于 2013-10-29T18:57:33.903 回答
0

尝试这样的事情:

public static void main(String[] args) {
    System.out.println("Enter a string:");
    Scanner IO = new Scanner(System.in);
    // read in user input
    String userString = IO.nextLine() + "-";

    int length = userString.length();

    int count = 0;
    String result = "";
    char new_char;

    for (int i = 0; i < length; i++) {
        new_char = userString.charAt(i);
        count++;
        if (new_char != userString.charAt(i + 1)) {
            if (count != 1) {
                result = result.concat(Integer.toString(count + 1));
            }
            result = result.concat(Character.toString(new_char));
            count = 0;
        }
        if (userString.charAt(i + 1) == '-')
            break;
    }

    System.out.println(result);
}
于 2013-10-29T18:57:41.567 回答
0

您可以使用嵌套的 for 循环来完成此操作,并执行以下操作:

       count = 0;
       String results = "";

       for(int i=0;i<userString.length();){
           char begin = userString.charAt(i);
           //System.out.println("begin is: "+begin);

           for(int j=i+1; j<userString.length();j++){
               char next = userString.charAt(j);
               //System.out.println("next is: "+next);

               if(begin == next){
                   count++;
               }
               else{
                   System.out.println("Breaking");
                   break;
               }
           }
           i+= count+1;
           if(count>0){
               String add = begin + "";
               int tempcount = count +1;

               results+= tempcount + add;

           }
           else{
               results+= begin;
           }

           count=0;

       }

   System.out.println(results);

我用 Hello 测试了这个输出,结果是 He2lo 也用 hellooopppppp 结果测试了 he2l3o6p

于 2013-10-29T19:04:29.080 回答
0

以下是具有更好时间复杂度的问题的解决方案:

public static void compressString (String string) {
  LinkedHashSet<String> charMap = new LinkedHashSet<String>();
  HashMap<String, Integer> countMap = new HashMap<String, Integer>();
  int count;
  String key;

  for (int i = 0; i < string.length(); i++) {
    key = new String(string.charAt(i) + "");
    charMap.add(key);
    if(countMap.containsKey(key)) {
     count = countMap.get(key);
     countMap.put(key, count + 1);
    }
    else {
     countMap.put(key, 1);
    }
  }

  Iterator<String> iterator = charMap.iterator();
  String resultStr = "";

  while (iterator.hasNext()) {
    key = iterator.next();
    count = countMap.get(key);

    if(count > 1) {
      resultStr = resultStr + count + key;
    }
    else{
      resultStr = resultStr + key;
    }
  }
  System.out.println(resultStr);
}
于 2018-01-12T03:00:24.147 回答