2016-12-07 4 views
1

Я ищу реализовать метод для выполнения базового сжатия строки в виде:Строка алгоритм сжатия в Java

aabcccccaaa -> a2b1c5a3 

У меня есть эта программа:

import java.util.Scanner; 

public class Main { 

    public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 

    String str = sc.nextLine(); 

    System.out.println(compress(str)); 
    } 

    public static String compress(String str) { 
    char[] chars = str.toCharArray(); 

    int count = 0; 
    String result = ""; 

    for (int i = 0; i < chars.length; i++) { 
     char curr = chars[i]; 
     result += curr; 

     for (int j = i; j < chars.length; j++) { 
     if (chars[j] == curr) { 
      count++; 
     } 
     else { 
      i += count; 
      break; 
     } 
     } 
     result += count; 
     count = 0; 
    } 

    return result; 
    } 

} 

Но в моих тестах я всегда не хватает последнего количества символов.

Я предполагаю, что это потому, что программа выходит из внутреннего цикла цикла, прежде чем это произойдет, но почему это так?

Большое спасибо

+1

ага вам нужно следить за последним персонажем, с которым вы попадаете, и когда вы выходите из цикла for, добавьте a3 в свою строку –

+1

Запустив его с помощью aaabbbccc, вы получите a3b2c2c1. Вам нужно пересмотреть свой алгоритм. В частности, о том, как вы увеличиваете i. –

+1

Не создавайте потенциально долго 'String' добавление "к текущему неизменяемому значению переменной типа' String': используйте ['StringBuilder.append()'] (https://docs.oracle.com/javase /8/docs/api/java/lang/StringBuilder.html#method.summary). Попробуйте использовать только одну итерацию. – greybeard

ответ

1

Вам не нужно два для петель для этого и может сделать это на одном дыхании, как так

String str = "aaabbbbccccca"; 
    char[] chars = str.toCharArray(); 
    char currentChar = str.length() > 0 ? chars[0] : ' '; 
    char prevChar = ' '; 
    int count = 1; 
    StringBuilder finalString = new StringBuilder(); 

    if(str.length() > 0) 
    for(int i = 1; i < chars.length; i++) 
    { 
     if(currentChar == chars[i]) 
     { 
      count++; 
     }else{ 
      finalString.append(currentChar + "" + count); 
      prevChar = currentChar; 
      currentChar = chars[i]; 
      count = 1; 
     } 
    } 

    if(str.length() > 0 && prevChar != currentChar) 
     finalString.append(currentChar + "" + count); 

    System.out.println(finalString.toString()); 

Выход: a3b4c5a1 для aaabbbbccccca

0
Keep a track of character that you are reading and compare it with next character of the string. If it is different, reset the count. 

public static void stringCompression (String compression) { 
     String finalCompressedString = ""; 
     char current = '1'; 
     int count = 0; 

     compression = compression + '1'; 

     for (int i = 0; i < compression.length(); i++) { 
      if (compression.charAt(i) == current) { 
       count = count + 1; 
      } else { 
       if (current != '1') 
        finalCompressedString = finalCompressedString + (current + Integer.toString(count)); 
        count = 1; 
        current = compression.charAt(i); 
      } 
     } 
     System.out.println(finalCompressedString); 
    } 
+0

(Не создавайте потенциально долго 'String' добавление "к текущему неизменяемому значению типа' String': используйте 'StringBuilder.append()'.) Это работает для '" press1 "'? – greybeard

Смежные вопросы