【问题标题】:Iterate a string until int or char迭代一个字符串直到 int 或 char
【发布时间】:2021-11-29 17:00:54
【问题描述】:

我想从string 变成两个vectors

来自:

std::string input = "82aw55beA1/de50Ie109+500s";

到:

std::vector<int> numbers = {82,55,1,50,109,500};
std::vector<char> notNumbers = {'a','w','b','e','A','/','d','e','I','e','+','s'};

如何以最有效的时间复杂度做到这一点?

【问题讨论】:

  • 为什么要关注复杂性?您需要具有线性复杂性的东西,而我很难想象比线性复杂性更糟糕的东西
  • 因为我是初学者,我认为在大多数情况下复杂性和简单性是齐头并进的。我的目标是尽可能简单地得到答案(以便我能理解)。如果不是这种情况,请教育我。 @463035818_is_not_a_number

标签: c++ string vector


【解决方案1】:

您可以对字符串进行一次传递。你需要知道你当前是否在解析一个数字,你是否“在”一个数字,以及你当前所在的数字。

这是一个非常简单的过程,但如果您有任何问题,请提出。

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

int main() {
    std::string input = "82aw55beA1/de50Ie109+500s";

    std::vector<int> numbers;
    std::vector<char> notNumbers;

    int currentNumber = 0;
    bool inNumber = false;

    for (auto ch : input) {
        if (std::isdigit(ch)) {
            if (!inNumber) {
                currentNumber = 0;
                inNumber = true;
            }
  
            currentNumber = currentNumber * 10 + (ch - '0');
        }
        else {
            if (inNumber) {
                numbers.push_back(currentNumber);
                inNumber = false;
            }
 
            notNumbers.push_back(ch);
        }
    }

    if (inNumber) {
        numbers.push_back(currentNumber);
    }

    for (auto i : numbers) {
        std::cout << i << std::endl;
    }

    for (auto ch : notNumbers) {
        std::cout << ch << std::endl;
    }
}

【讨论】:

    猜你喜欢
    • 2012-04-22
    • 1970-01-01
    • 2010-11-12
    • 2016-06-17
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    相关资源
    最近更新 更多