这被认为是硬编码吗?

时间:2016-02-16 05:51:34

标签: c++ c++11 visual-c++

我有一个任务,我们需要一个字符串,一个和一个位置,pos,我需要"收集"在该位置的所有整数。例如,说3 abcdef123应该输出abc123def(整数从位置3开始)。接受这些参数的主要部分没有图示。

示例输入可能如下所示:

  

5 ab1cdefgh(1移动到第5个索引)

     

6 1abcdefgh(1移动到第6个指数)

     

8 1abcdefgh(1移动到最后)

     

8 abcdefgh1(1不动)

     

0 1abcdefgh

     

-1(退出)

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整数。我们的代码必须在O(n ^ 2)时间运行。

更困难的输入可能如下所示:

  

6 12ab3cdefghij456klm7n8op9q0

建议的解决方案涉及使用交换语句。我的代码满足所有其他要求,除了缺少交换语句。最后,我只想问:这有资格作为硬编码吗?

1 个答案:

答案 0 :(得分:3)

您所做的硬编码是期望字符串中的字母以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);
}