我有一个任务,我们需要一个字符串,一个和一个位置,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
建议的解决方案涉及使用交换语句。我的代码满足所有其他要求,除了缺少交换语句。最后,我只想问:这有资格作为硬编码吗?
答案 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);
}