C++ 代码改进和时间效率方面的帮助

C++ 代码改进和时间效率方面的帮助,c++,performance,C++,Performance,我写了一个程序,将字符串中的每个单词都反转。例如,“你好”和“再见”变成了olleh dna eybdoog。我的程序可以运行,但是时间效率是o(n^2),我可能可以编写更少的代码。我试图不使用任何string.functions()(我曾经使用过string.length()。如有任何提示或建议,将不胜感激 #include <iostream> using namespace std; void breakString(string& me, char * otherOn

我写了一个程序,将字符串中的每个单词都反转。例如,“你好”和“再见”变成了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++;
}
}   
#包括
使用名称空间std;
void breakString(string&me,char*otherOne,int len,int count);
无效反向限制(字符*s);
int main(){
string me=(“你好,再见”);
字符*另一个;
int len=0;
整数计数=0;

对于(len;len,您应该能够在输入和输出字符串之间使用堆栈来完成此操作。堆栈对于保存当前单词很有用,它也可以为您进行反转。我不打算为其编写完整代码,但算法是:

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:如果这是家庭作业,如果你将其标记为家庭作业,人们更可能会帮助你。

你应该能够在输入和输出字符串之间使用堆栈来完成这项工作。堆栈对保存当前单词很有用,它也为你做了反转。我不打算为其编写完整的代码,但算法是:

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)

希望这有帮助


注:如果这是家庭作业,如果你把它贴上这样的标签,人们会更愿意帮助你。

这可不简单

#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;
}
#包括
使用名称空间std;
int main(){
string me=(“你好,再见”);
int i,j,指数=0;
char-tmp;
对于(i=0;iindex;j--,索引++){
tmp=me[index];
me[index]=me[j];
me[j]=tmp;
}           
指数=i+1;
}

cout不是那么简单的事情

#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;
}
#包括
使用名称空间std;
int main(){
string me=(“你好,再见”);
int i,j,指数=0;
char-tmp;
对于(i=0;iindex;j--,索引++){
tmp=me[index];
me[index]=me[j];
me[j]=tmp;
}           
指数=i+1;
}

你们是否意识到std::string有一个反向迭代器,对吗?为什么不直接从我这里迭代呢“?@Paul-不是重复的。这一个反转了整个字符串;Aaron正在寻找一个逐字反转器。概念非常相似-他所要做的就是找到一个指向每个单词开头和结尾的指针,并使用引用问题中的代码将其反转。显然,这是一个家庭作业,它应该被标记为这样,并完善您。”你可能意识到std::string有一个反向迭代器,对吧?为什么不直接从我这里迭代呢“?@Paul-不是重复的。这一个反转了整个字符串;Aaron正在寻找一个逐字反转器。概念非常相似-他所要做的就是找到一个指向每个单词开头和结尾的指针,并使用引用问题中的代码将其反转。显然,这是一个家庭作业,它应该被标记为这样,并完善您。”r问题。或者只是
std::reverse(me.begin()+index,me.begin()+i);
而不是for循环。在我的索引上加上或减去一个out by one错误。谢谢你的代码短得多。出于同样的原因,我猜我的代码也应该是O(n)。每个单词都要读两次,而不是一次半。当你交换时,你会读第二次这个单词(除了字符数为奇数的单词的中间字符)并且总是写一次(当长度为奇数时,再减去一个字符)或只写
std::reverse(me.begin()+index,me.begin()+i);
而不是for循环。在我的索引上加上或减去一个out by one错误。谢谢你的代码短得多。出于同样的原因,我猜我的代码也应该是O(n)。每个单词都要读两次,而不是一次半。当你交换时,你要再读一次单词(除了单词中间的奇数字符)而且它总是写一次(当长度为奇数时,再减去一个字符)