【问题标题】:Compression algorithm in javajava中的压缩算法
【发布时间】:2013-11-09 02:07:54
【问题描述】:

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

输入:hellooopppppp!
输出:he2l3o6p!

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

当我有输入时:你好

我的代码输出: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);
}

}

【问题讨论】:

  • 你将如何压缩 1223334444?顺便说一句 ll2l 大小相同
  • 1) 请参阅上面 Peter Lawrey 的评论和下面的回答 2) 使用 StringBuilder 构建字符串而不是 concat() 3) 您可以附加一个字符而不将其转换为 String()

标签: java string compression


【解决方案1】:

我愿意

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

【讨论】:

    【解决方案2】:

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

    您的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;
               }
           }
       }
    

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        试试这样的:

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

        【讨论】:

          【解决方案5】:

          您可以使用嵌套的 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测试过

          【讨论】:

            【解决方案6】:

            我就是这样做的。很简单:

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

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

                猜你喜欢
                • 2019-11-11
                • 2016-08-18
                • 1970-01-01
                • 1970-01-01
                • 2011-07-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多