Странный вывод для вектора символов - PullRequest
2 голосов
/ 05 марта 2019

Справочная информация:

Этот вопрос связан с проблемой ежедневного кодирования № 29.

Кодирование по длине прогона - это быстрый и простой метод кодирования строк.,Основная идея состоит в том, чтобы представлять повторяющиеся последовательные символы как единый счет и символ.Например, строка «AAAABBBCCDAA» будет закодирована как «4A3B2C1D2A».

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

Попытка решения:

#include <iostream>
#include <string>
#include <vector>

std::vector<char> run_length(std::string str)
{
    std::vector<char> result;
    if (str.empty() || str.size() == 1)
    {
        const char *ch = str.c_str();
        result.push_back(*ch);
        return result;
    }

    int count = 1;
    for (int i = 1; i < str.size(); ++i)
    {
        if (str[i] == str[i - 1])
            count++;
        else
        {
            if (count > 1)
            {
                char ch = count;
                result.push_back(ch);
            }
            result.push_back(str[i - 1]);
            count = 1;
        }
    }
    if (count > 1)
    {
        char ch = count;
        result.push_back(ch);
    }
    result.push_back(str[str.size() - 1]);

    return result;
}

int main()
{
    std::string str = "AAAABBBCCAA";
    auto result = run_length(str);

    for (auto it : result)
        std::cout << it << " ";

    std::cin.get();
}

Ожидаемый результат:

4A3B2C1D2A

Фактический вывод:

 A  B  C  A  

Вопрос:

Почему я получаю эти странные символы для фактического вывода?Я верю, что логика моего подхода должна работать для решения проблемы, но все же я получаю таких персонажей, которых раньше не видел.Любые предложения с благодарностью.

Ответы [ 2 ]

4 голосов
/ 05 марта 2019

Линия

char ch = count;

неверно.

Если count равно 4, то ch инициализируется символом, который кодируется целочисленным значением 4. Вам необходимо получить символ, представляющий цифру. Вам нужно '4'. Вы можете использовать следующее, чтобы получить цифру от count.

char ch = '0' + count;

Однако, если count больше 9, это не сработает. Вам придется придумать другую стратегию, если вы ожидаете, что count будет больше 9.

0 голосов
/ 06 марта 2019

С небольшими изменениями в контейнере и использованием std :: to_string () я смог заставить его работать идеально.

// Daily coding problem #29
// Run-length encoding is a fast and simple method of encoding strings. The basic idea is to represent repeated successive characters as
// a single count and character. For example, the string "AAAABBBCCDAA" would be encoded as "4A3B2C1D2A".

// Implement run - length encoding and decoding.You can assume the string to be encoded have no digits and consists solely of alphabetic
// characters.You can assume the string to be decoded is valid.


#include <iostream>
#include <string>
#include <vector>

std::vector<std::string> run_length(std::string str)
{
    std::vector<std::string> result;
    if (str.empty() || str.size() == 1)
    {
        result.push_back(str);
        return result;
    }

    int count = 1;
    for (int i = 1; i < str.size(); ++i)
    {
        if (str[i] == str[i - 1])
            count++;
        else
        {
            if (count > 1)
            {
                result.push_back(std::to_string(count));
            }
            result.push_back((std::string(1, str[i - 1])));
            count = 1;
        }
    }
    if (count > 1)
    {
        result.push_back(std::to_string(count));
    }
    result.push_back(std::string(1, str[str.size() - 1]));

    return result;
}

int main()
{
    std::string str = "AAAAAAAAAABBBCCAA";
    auto result = run_length(str);

    for (auto it : result)
        std::cout << it << " ";

    std::cin.get();
}
...