Кут пуст, и я не знаю почему - PullRequest
0 голосов
/ 13 мая 2019

Работа над упражнением с leetcode, которое вы можете увидеть здесь: https://leetcode.com/problems/unique-morse-code-words/

У меня проблемы с получением правильного ответа, но еще больше проблем с поиском проблемы.Я пытаюсь использовать cout для печати векторов, с которыми я работаю, чтобы выяснить, в чем дело, но, похоже, по какой-то причине он выводит пустую строку.

Вот мой код ...

#include <array>
#include <algorithm>
#include <vector>
#include <iostream>

using namespace std;

class Solution {
public:
int uniqueMorseRepresentations(vector<string>& words) {
    int num_of_uniq_words = 0;
    string arr[] = {"a","b", "c", "d", "e", "f", "g", "h", "i", "j", "k", 
                    "l", "m","n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}; 
    string maps[] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..",
                     "--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
    vector<string> all_words_morse;
    for (int i = 0; i < words.size(); i++) {
        string morse;
        for (int j = 0; j < words[i].length(); j++){

                for(int q = 0; q < sizeof(arr)/sizeof(arr[0]); q++) {
                    if (arr[q] == to_string(words[i].at(j))) 
                        morse.append(maps[q]);
                }


        }
        //cout << morse << endl;
        all_words_morse.push_back(morse);
    }
    vector<string> uniq_words;
    for(int i = 0; i < all_words_morse.size(); i++) {
        if (find(uniq_words.begin(), uniq_words.end(), all_words_morse[i]) == uniq_words.end()) //not present
            uniq_words.push_back(all_words_morse[i]);
    }
    //printing
    for (int i = 0; i < all_words_morse.size(); i++)
        cout << all_words_morse[i] << " ";
    cout << "\n" << endl;
    for (int i = 0; i < uniq_words.size(); i++)
        cout << uniq_words[i] << " ";
    cout << "\n" << endl;

    num_of_uniq_words = uniq_words.size();
    return num_of_uniq_words;
}
};

и при вводе тестового примера ["gin", "zen", "gig", "msg"] sdtout будет ... "

"
, что составляет около 4 пустых строкСтрока и я не понимаю почему.У кого-нибудь есть совет или знаете, что я делаю не так ??Спасибо

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Проблема заключается в использовании функции to_string. Он не делает то, что вы думаете:

станд :: to_string

Преобразует числовое значение в std :: string.

И вы передаете ему символ, чтобы он интерпретировал символ как числовое значение, то есть его значение ASCII. А для «g» вы получите «103», например.

И почему arr является массивом строк, а не символов, если он содержит только символы? Если бы это был массив символов, вам бы не понадобилась функция to_string.

P.S. Чтобы найти проблемы в вашем коде, лучше всего отладить его. Отладчик - это инструмент, который должен использовать каждый программист. Поэтому, пожалуйста, проверьте это.

0 голосов
/ 13 мая 2019

Проблема

Функция std::to_string не принимает char в качестве параметра, поэтому она неявно преобразует его в тип int, который возвращает строкучисла.Например: to_string('a') -> to_string(97) -> "97".

Исправить

Правильно преобразовать char в строку, используя std::string(1,words[i].at(j)), или использовать метод substr из std::string.

Альтернативный подход

Как предложено Томасом Мэтьюсом в комментариях, используйте std::map<char, std::string> и создайте карту, чтобы избежать необходимости управлять двумя спискамипреобразование и сэкономить время, используя структуру, которая выполняет поиск в O(logn) вместо O(n).

...