Создание строкового результата в String Compression - PullRequest
0 голосов
/ 03 августа 2020

У меня возникают трудности с формулированием возможного решения вопроса, называемого сжатием строки, когда мне нужно сжать строку на основе повторяющихся символов

INPUT: aabbccddeeff OUTPUT a2b2c2d2e2f2

INPUT: abbbccddeeff ВЫВОД: a1b3c2d2e2f2

Мой код в настоящее время может идентифицировать повторяющиеся символы (скоро я реализую logi c для неповторяющихся символов)

Мой вопрос: Как мне введите количество раз, когда появляется символ, я думаю об использовании пустой строки и динамическом построении решения, однако это оказывается относительно сложным

Мой код

*public static void strCompression(String word){
     char[] arr = word.toCharArray();
     int idx = 0;
     int jdx = idx + 1;
     int times = 0;
     String empt = "";
     while (idx<arr.length)
     {
         while(jdx != arr.length)
         {
             if(arr[idx] == arr[jdx])
             {
                 times = (jdx - idx) + 1;
                  
             }
              idx = jdx;
             ++jdx;
         }
         ++idx;
     }
     
}*

Может кто-нибудь дайте мне несколько советов о том, как go это сделать.

Также в моем фрагменте кода index i получает индекс j, если нет повторяющихся элементов, затем он начинает подсчет, чтобы проверить, есть ли другие повторяющиеся элементы. так, например,

aaaaabbbbb

указатель idx находится в 0, который является a, jdx подсчитывает, сколько раз встречается a, когда индекс в i не равен индексу в j (разные значения char) тогда мы установим индекс в i равным индексу в j

Если это будет idx = jdx + 1 или idx = jdx;

1 Ответ

1 голос
/ 03 августа 2020

указатель idx находится в 0, который является a, jdx подсчитывает, сколько раз происходит a, когда индекс в i не равен индексу в j (разные значения char), тогда мы установим индекс в i равным равен индексу в j

Да, idx = jdx правильно.

Logi c:

Вы реализовали это, пока получение частоты элемента.

Итак, переходя к следующей части,

  1. всякий раз, когда вы получаете другой элемент, вам нужно добавить этот элемент с помощью к empt и изменить индексы соответственно и выход из внутреннего while loop.

// if element is same change the times accordingly
if(arr[idx] == arr[jdx])
 {
     times = (jdx - idx) + 1;
      
 }

// if different add to empt and change idx and jdx accordingly
else {
    empt += arr[idx];
    empt += times.toString();
    times = 1;
    idx = jdx;
    jdx++;
    break;
}
Еще кое-что нужно сделать, потому что приведенный выше код не будет обрабатывать случай, если мы не введем else statement (это происходит, когда последний элемент уникален (или) тот же, что и его предыдущие элементы), т.е. в основном для обработки последний элемент.
while (idx < len)
{
     while(jdx != len)
     {
        ...
     }

     if (jdx == len) {
        times = (jdx - idx);
        empt += arr[idx];
        empt += times.toString();
        break;
     }
}

Полный код:


int times = 1; // if the first element appears only once
while (idx < len)
{
     while(jdx != len)
     {

         if(arr[idx] == arr[jdx])
         {
             times = (jdx - idx) + 1;
              
         }

         else {
            empt += arr[idx];
            empt += times.toString();
            times = 1; // resetting times = 1
            idx = jdx;
            jdx++;
            break;
         }
        ++jdx;
     }

     if (jdx == len) {
        times = (jdx - idx);
        empt += arr[idx];
        empt += times.toString();
        break;
     }
}

Примечание:

Есть некоторые избыточность здесь, например, обновление times каждый раз, когда вы сталкиваетесь с одним и тем же элементом, поэтому я оставляю это как упражнение.

...