Как установить мою функцию декодирования, чтобы принять в кодированной строке? - PullRequest
0 голосов
/ 24 апреля 2019

Я работаю над своей функцией декодирования и ударился о стену.Я не знаю, должен ли я передать функцию кодирования или создать класс.Моя функция кодирования сжимает строку, мне нужна функция декодирования, чтобы взять эту кодированную строку и развернуть ее.

Мне сказали, что это то же самое, что и функция кодирования.Я не уверен, куда идти.

#include<iostream>
#include<string>

using namespace std;

string encode(string str)
{
    string encoding = "";
    int count;

    for  (int i = 0; str[i]; i++)
    {
        count = 1;
        while (str[i]==str[i+1])
        {
            count++, i++;
        }
        encoding += to_string(count) + str[i];
    }
    return encoding;
}

//Im trying to decode the encoded string
//take in a string and count how many of the same characters there are and print
//e.g 
// a3b4c1......would be decoded as aaabbbbc
string decode(string in)
{
    string decoding = "";
    char s;
    int count;
    for (int i = 0; i<in; i++)
    {
        count = 1;
        if (in[i] == 'A')
            count++, i++;
    }

}

int main()
{
    string str = "ABBCC";
    cout << encode(str);
    //cout << decode(str);

}

// My encode functions executes as needed. 1A2B2C

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Ваша кодировка недопустима, потому что кодировка "1a" выдает "111a", которая также является кодировкой 111 последовательных 'a', вам нужно добавить разделитель между счетчиком и символом

В вашей функции декодирования вы управляете только особым случаем A и не извлекаете счетчик, введенный кодировщиком

Примечание также в

for (int i = 0; i<in; i++)
{
    count = 1;
    if (in[i] == 'A')
        count++, i++;
}

вы всегда сбрасываете счет на 1

Вы должны сначала извлечь счетчик (с проблемой, которую я сигнализирую в начале моего ответа), а затем продублировать букву 'count' раз

Бесполезно делать string encoding = "";, потому что конструктор std::string делает его пустым, может быть просто string encoding;

Вам необходимо декодировать закодированную строку, это не то, что вы делаете в своей main , где вы пытаетесь декодировать исходную строку


Исправленная версия может быть:

#include<iostream>
#include<string>
#include <sstream>

using namespace std;

string encode(string str)
{

  stringstream encoding;
  int count;

  for  (int i = 0; str[i]; i++)
  {
    count = 1;
    while (str[i]==str[i+1])
    {
      count++, i++;
    }
    encoding << count << ' ' << str[i];
  }
  return encoding.str();
}

string decode(string in)
{
  stringstream is(in);
  string decoding;
  int n;
  char c;

  while (is >> n >> c)
  {
    while (n--)
      decoding += c;
  }

  return decoding;
}

int main()
{
  cout << encode("ABBCC2a") << endl;
  cout << decode(encode("ABBCC2a")) << endl;

  return 0;
}

Компиляция и исполнение:

pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra e.cc
pi@raspberrypi:/tmp $ ./a.out
1 A2 B2 C1 21 a
ABBCC2a
0 голосов
/ 24 апреля 2019

Кодировка длины строки - но очень странным образом!

encoding += to_string(count) + str[i];

Давайте закодируем строку "sssssssssss";это приведет к строке с представлением массива

{ '1', '1', 's', 0 } // string "11s"

(я выбрал это представление сознательно, вы увидите позже ...)

Проблема в том, что вы не будетевозможность кодировать строки, содержащие цифры: "1s" приведет к

{ '1', '1', '1', 's', 0 } // string "111s"

, но как бы вы хотели различить, если нам нужно декодировать обратно до "1s" или в строку, содержащую только 111 s символов?

Попробуйте по-другому: символ на самом деле тоже не более чем число, например, буква s представлена ​​числовым значением 115 (как минимум в ASCII и совместимом), цифрой 7 (как символ!) числовым значением 55. Таким образом, вы можете просто добавить значение в виде символа:

encoding += static_cast<unsigned char>(count) + str[i];

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

{ 255, 's', 7, 's', 0 } // 262 times letter s

Обратите внимание на представление;255 и 7 даже не печатные символы!Теперь давайте предположим, что мы закодировали строку с 115-кратной буквой s:

{ 115, 's', 0 } // guess, as string, this would be "ss"...

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

Теперь декодирование становится намного проще:

size_t i = 0;
while(i < encoded.size())
{
    unsigned char n = encoded[i];
    ++i;
    while(n--)
        decoded += encoded[i];
    ++i;
}

Абсолютно просто: первый байт всегда как число, второй - как символ ...

Если вы настаиваете на кодировании чисел в виде строки (и кодировании только строк, не содержащих цифр),Вы можете использовать std::istringstream:

std::istringstream s(encoded);
unsigned int n;
char c;
while(s >> n >> c)
{
    while(n--)
        decoded += encoded[i];
}

OK, это не симметрично вашей функции кодирования.Вы могли бы приспособить последний, чтобы быть таким, хотя:

std::ostringstream s;

for(;;) // ...
{
    unsigned int count = 1;
    // ...
    s << count << str[i];
}
...