我有一个分配,我们需要一个字符串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/