我编写了一个程序来反转字符串中的每个单词。例如,你好和再见变成了olleh dna eybdoog。我的程序工作,但时间效率是o(n ^ 2),我可能写的代码更少。我试图不使用任何string.functions()(我曾使用过string.length())。任何提示或建议将不胜感激。
#include <iostream>
using namespace std;
void breakString(string& me, char * otherOne, int len, int count);
void reverseString(char* s);
int main () {
string me=("hello and goodbye");
char * otherOne;
int len=0;
int count=0;
for (len; len<me.length()+1; len++){
count++;
if (me[len]=='\0') {
otherOne=new char[count];
len-=count-1;
count=0;
for (len; me[len]; len++){
otherOne[count]=me[len];
count++;
}
reverseString(otherOne);
breakString( me, otherOne, len, count);
}
if (me[len]==' ' ) {
otherOne=new char[count];
len-=count-1;
count=0;
for (len; me[len] != ' '; len++){
otherOne[count]=me[len];
count++;
}
reverseString(otherOne);
breakString( me, otherOne, len, count);
count=0;
otherOne=NULL;
delete[]otherOne;
}
}
delete[]otherOne;
cout << me;
return 0;
}
void reverseString(char* s)
{
int len =0;
char swap;
for (len=0; s[len] != '\0'; len++);
for ( int i=0; i<len/2; i++)
{
swap = *(s+i);
*(s+i)= *(s+len-i-1);
*(s+len-i-1) = swap;
}
}
void breakString(string &me, char * otherOne, int len, int count){
len-=count;
for (count=0; otherOne[count]; count++){
me[len]=otherOne[count];
len++;
}
}
答案 0 :(得分:1)
就像
那样简单#include <iostream>
using namespace std;
int main () {
string me=("hello and goodbye");
int i,j, index=0;
char tmp;
for (i=0; i<me.length()+1; i++)
if (me[i] == ' ' || me[i] == '\0') {
for(j=i-1;j>index;j--,index++) {
tmp = me[index];
me[index] = me[j];
me[j] =tmp;
}
index = i+1;
}
cout << me;
return 0;
}
复杂性是O(n):每个单词被读取两次(或者,更好,一次半):一旦自程序找到空格或\ 0,那么,在嵌套for中,单词被反转。 index
表示单词begin char。
答案 1 :(得分:0)
您应该可以在输入和输出字符串之间使用堆栈来执行此操作。堆栈对于保存当前单词非常有用,它也可以为您进行反转。我不打算为它编写完整的代码,但算法是:
String output = ""
char Stack stack = []
while input.not_empty:
char c = input.get_char
if c == ' ':
while stack.not_empty:
output.put_char(stack.pop)
output.put_char(c)
else:
stack.push(c)
while stack.not_empty:
output.put_char(stack.pop)
return output
那将给你O(n),并且很容易证明:
所以:4 * n * O(1),即O(n)。
希望这有帮助!
PS:如果这是家庭作业,如果你这样做,人们更有可能帮助你。