帮助提高代码和提高时间效率

时间:2011-09-08 01:01:42

标签: c++ performance

我编写了一个程序来反转字符串中的每个单词。例如,你好和再见变成了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++;
}
}   

2 个答案:

答案 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),并且很容易证明:

  • 每个字符读取一次(O(1))
  • 它被推到堆栈(最多)一次(O(1))
  • 它最多弹出一次(O(1))
  • 写了一次(O(1))

所以:4 * n * O(1),即O(n)。

希望这有帮助!

PS:如果这是家庭作业,如果你这样做,人们更有可能帮助你。