C ++ - целочисленный синтаксический анализ - PullRequest
1 голос
/ 01 мая 2020

Я борюсь с проблемой 'StringStream' из HackerRank . Чтобы быть точным, мне дают строку целых чисел, разделенных запятыми, например, «23,4,56», и мне нужно проанализировать их и вернуть вектор целых чисел.

Я пробовал разные способы решения этой проблемы, но они не работают для меня.

Это оригинальный код.

#include <sstream>
#include <vector>
#include <iostream>

using namespace std;

vector <int> parseInts(string str)
{
    // Function to complete.
}

int main()
{
    string str;
    cin >> str;

    vector <int> integers = parseInts(str);

    for (int i = 0; i < integers.size(); i++)
    {
        cout << integers[i] << "\n";
    }

    return 0;
}

Это мой первый идея, конвертация с библиотекой StringStream.

vector <int> parseInts(string str) 
{
    stringstream ss(str); 
    int number;
    // To help with conversion.

    vector <int> temporary;
    // Vector of results.

    for (int i = 0; i < str.length(); i++)
    {
        ss >> number;
        temporary.push_back(number);
    }

    return temporary;
}

Это моя вторая идея.

vector <int> parseInts(string str) 
{
    int number;
    vector <int> temporary;

    for (int i = 0; i < str.length(); i++)
    {
        number = (str[i]);
        temporary.push_back(number);
    }

    return temporary;
}

Это последняя идея, я хотел работать над char *.

vector <int> parseInts(string str)
{
    char* characters;
    strcpy(characters, str.c_str());
    int numbers;
    vector <int> temp;

    for (int i = 0; i < str.length(); i++)
    {
        numbers = stoi(characters);
        temp.push_back(numbers);
    }

    return temp;
}

Помимо последнего примера они вернули несколько странных чисел. Как с этим справиться?

Ответы [ 3 ]

2 голосов
/ 01 мая 2020

Вы были почти там, используя ваш первый подход, вам нужно использовать std :: getline для разделения, используя запятую в качестве разделителя.

vector<int> parseInts(string str) 
{
    stringstream ss(str); 
    string token;
    vector<int> v;
    while (getline(ss, token, ',')) {
        int x = stoi(token);
        v.push_back(x);
    }

    return v;
}

Вот ссылка, по которой я ее тестировал: https://ideone.com/JGOpS1

1 голос
/ 01 мая 2020

В вашем последнем подходе вы забыли перебрать characters. Вы в основном str.length() раз звоните stoi("23,4,56"). Это основной источник неопределенного поведения и некоторых странных чисел.

Проблемы с хакерранками имеют полезный раздел для обсуждения . Вы можете найти множество способов решения этой проблемы.

1 голос
/ 01 мая 2020

Вы можете сделать что-то вроде этого:

stringstream ss;
ss << str;
vector<int> res;
while (ss) {
    int n;
    ss >> n;
    res.push_back(n);
    char c;
    ss >> c;
}
...