我有一个字符串str[]="ABCDEFGHI"
,并说n = 3。我需要为任何输入字符串实现reversestring(arr,n)
逻辑,对于任何n值。在这种情况下,我的输出必须是str = "CBAFEDIHG"
如果我的str[]="PQRSTUVWXYZ"
,对于n = 4,我的输出必须是str = "SRQPWVUTXYZ"
。在这种情况下,您可以忽略倒转最后一次出现,因为少于4个字母。
对于input[]="this is a simple test", output[]="sith si a elpmis tset"
,如果不使用c ++中的函数重载使用任何第n个出现条件,可以推广类似的逻辑。
答案 0 :(得分:1)
假设您正在处理C风格的字符串,如果您想要反转每n个字符,您可以简单地执行以下操作:
//Iterators
int x, y;
char str[] = "ABCDEFGHI";
int n = 3;
int strLen = strlen(str);
//Assuming C99+ for variable length arrays...
char newStr[strLen + 1];
if (strLen % n != 0) {
printf("For this simple example the length of str must be a multiple of n\n");
return 0;
}
for (x = 0; x < strLen; x += n) {
for (y = 0; y < n; y++) {
newStr[x + y] = str[x + (n - y) - 1];
}
}
//Ensure string is terminated properly
newStr[strLen] = 0;
printf("Converted %s to %s\n", str, newStr);
return 0;
就推广这个而言,你给出的第二个例子涉及翻转单词,而不是n
个字符的块,因此你需要一个不同的接近,将字符串拆分为单独的单词并反转那些块,这是一个不同的问题
答案 1 :(得分:1)
以下是仅使用一个库函数std::reverse
:
#include <iostream>
#include <algorithm>
int main() {
std::string s1 = "ABCDEFGHI";
std::string s1_output = "CBAFEDIHG";
std::string s2 = "PQRSTUVWXYZ";
std::string s2_output = "SRQPWVUTXYZ";
int N1 = 3;
int N2 = 4;
for (unsigned int i = 0; i < s1.size() / N1; i++)
std::reverse(s1.begin() + (i * N1), s1.begin() + (i * N1 + N1));
std::cout << std::boolalpha << (s1 == s1_output) << std::endl; // true
for (unsigned int i = 0; i < s2.size() / N2; i++)
std::reverse(s2.begin() + (i * N2), s2.begin() + (i * N2 + N2));
std::cout << std::boolalpha << (s2 == s2_output) << std::endl; // true
}
您的第二个示例与您的第一个示例不同,因为您在单个单词上操作,而不是范围。它也有所不同,因为您不会忽略小于N
的块。
根据评论中的建议,您可以使用std::istringstream
并使用提取运算符,在空格之间提取“块”。
#include <iostream>
#include <algorithm>
#include <sstream>
#include <iterator>
int main() {
std::string s1 = "this is a simple test";
std::string s1_output = "siht si a elpmis tset"; // you made a typo
std::istringstream iss(s1);
std::string chunk;
std::string output = "";
while (iss >> chunk) {
std::reverse(chunk.begin(), chunk.end());
output += chunk + " ";
}
output.erase(output.size() - 1, output.size()); // chop off remaining space
std::cout << std::boolalpha << (output == s1_output); // true
}