Сжатие длины выполнения только для цикла

#c

#c

Вопрос:

Я пытаюсь использовать кодировку длины выполнения.
Проблема в том… a равно 2 раза, но cout show f равно 3. A не отображается в результате. И количество переменных последнего элемента остается равным последнему элементу.

 #include <iostream>

using namespace std;
int main()
{
    string str = "aafffkhjskk";
    int arr[100];
    int count = 1;
    cout << str << endl;
    // print text on screen

    for (int r = 0; r < str.length(); r  ) {
        // Str 0 strating point
        for (int in = r; in < str.length(); in  ) {
            // r = in because increment finding element
            if (str[r] == str[in]) {
                count  ;
            }
            else {
                r  = (count - 1);
                // r value is equal to count
                cout << " r " << r << " count " << count << endl;
                cout << count << " ****** "
                     << str[r] << endl;
                count = 1;
                // making count 1 again.
                break;
            }
        }
    } // for end here
}
 

Комментарии:

1. Вы обнаружите, что читать и отлаживать ваш код намного проще, когда он следует стандартным правилам отступов. Для кодирования длины выполнения требуется только один цикл.

2. Я думаю, что начальное значение count должно быть 0, а не 1

Ответ №1:

Ваш выбор r (для следующей начальной позиции) неверен. Я предлагаю использовать a r_next для обозначения следующего символа, который является ближайшим символом, отличным от текущего поискового. Флаг a pick_next указывает, r_next установлен он или нет (0 не установлен, 1 установлен). Следующий поиск будет начинаться с r_next :

 #include <iostream>
using namespace std;
int main()
{
    string str = "aafffkhjskk";
    int pick_next, r_next, count;
    cout << str << endl;
    int r = 0, count = 0;
    while ((r   count) < str.size()) {
        count = 0; // Str 0 strating point
        pick_next = 0;
        for (int in = r; in < str.length(); in  ) {
            // r = in because increment finding element
            if (str[r] == str[in]) {
                count  ;
            }
            // mark the first non-identical position
            else {
                if (pick_next == 0) {
                    r_next = in;
                    pick_next = 1;
                }
            }
        }
        cout << "count = " << count << " ****** " << str[r] << endl;
        r = r_next; // place r for next search
    } // end of while
}

Test run:

    $ ./a.exe
    aafffkhjskk
    count = 2 ****** a
    count = 3 ****** f
    count = 3 ****** k
    count = 1 ****** h
    count = 1 ****** j
    count = 1 ****** s
    count = 2 ****** k
--
 

Комментарии:

1. Спасибо … но это всего лишь строка печати

2. @Lalitb Извините, есть одна ошибка копирования-вставки. Я исправил это, попробуйте.

3. Извините за поздний ответ Спасибо