我有一个分配,我们需要一个字符串s和一个位置pos,并且我需要“收集”该位置上的所有整数。例如,说3 abcdef123应该输出abc123def(整数从位置3开始)。没有显示接受这些参数的主要位置。

输入示例如下所示:


void gatherDigits(std::string& s, const int pos) {

int ints = 1;
int size = s.size();

for (int i = 0; i < size; i++) {
    if (std::isdigit(s.at(i))) {
        ints++;
    }
}

s = "";
char letter;
char l;
int count = 0;
for (letter = 'a'; letter <= 'z'; letter++) {
    if (count == pos) {
        l = letter;
        break;
    }
    s = s + letter;
    count++;
}

for (int i = 1; i < ints; i++) {

    if (i == 10) {
        s = s + std::to_string(0);
    }
    else {

        s = s + std::to_string(i);
    }
}

for (int i = pos + ints; i < size + 1; i++) {
    s = s + l;
    l++;
   }
}

但是,我陷入了困境。我不确定这是否被认为是硬编码(明确指示我们不要硬编码)。我们唯一可以使用的变量是int和char,这就是为什么我要用这种方式设置它。此外,所有输入示例均为小写字母a-z和0-9 int。我们的代码必须在O(n ^ 2)时间内运行。

更困难的输入可能看起来像这样:



建议的解决方案涉及利用交换语句。我的代码除缺少swap语句外,还满足所有其他要求。最后,我只是在问:这符合硬编码吗?

最佳答案

您所做的硬编码是期望字符串中的字母以a开头并构建一个序列abcd....,并且您的数字形成1234...。我不能说您的主管是否认为这些代码是硬编码的,但这肯定会使您的代码变得非常僵化,并且只有在问题描述中明确指出了这些属性的情况下,我才会这样做。

关于交换的部分可能是指围绕实际字符交换字符串中的适当位置,而不是拆散整个字符串并创建一个新字符串,这仅在上述假设的情况下才可行。

正如评论中所暗示的那样,如果允许您使用标准算法,则可以极大地简化和概括您的解决方案。一种可能性例如是:

void gatherDigits(std::string& s, const int pos) {
    //moves all digits to the start of the range and returns the number of digits
    int cnt = std::stable_partition(s.begin(), s.end(), ::isdigit) - s.begin();

    //make sure we don't write past the end of the string
    assert(pos+cnt < s.size());

    //rotates the string such that the digits start at the correct place
    std::rotate(s.begin(), s.begin() + cnt, s.begin() + pos + cnt);
}

关于c++ - 这被认为是硬编码吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35424756/

10-13 06:59