你會(huì)如何改進(jìn)這個(gè)算法?

通過(guò)我在網(wǎng)上找到的一些編程面試挑戰(zhàn),我不得不編寫(xiě)一個(gè)算法來(lái)反轉(zhuǎn) const char * 并返回一個(gè)指向新 char * 的指針。我想我有它,但為了讓它正常工作,我不得不做一些奇怪的事情——基本上必須自己考慮空終止字符。不知何故,我覺(jué)得這是錯(cuò)誤的,但我很難過(guò),我想知道是否有人可以幫助我:

char*reverse(constchar* str)

{

intlength =strlen(str);

char* reversed_string =newchar[length+1];

for(inti =0; i < length; ++i)

? {

reversed_string[i] = str[(length-1) - i];

? }

//need to null terminate the string

reversed_string[length] ='\0';

returnreversed_string;

}

intmain(intargc,char* argv[])

{

char* rev_str =reverse("Testing");

cout <<"Your string reversed is this: "<< rev_str << endl;

deleterev_str;

rev_str =0;

return0;

}

解決方案

上面的 for 循環(huán)有錯(cuò)字。檢查循環(huán)變量 i 應(yīng)該是 <= 而不是 <,否則對(duì)于奇數(shù)個(gè)元素將失敗。for(int i = 0; i <= 長(zhǎng)度/2; ++i)

char*reverse(constchar* str)

{

if(!str)

returnNULL;

intlength =strlen(str);

char* reversed_string =newchar[length+1];

for(inti =0; i < length/2; ++i)

? {

reversed_string[i] = str[(length-1) - i];

reversed_string[(length-1) - i] = str[i];

? }

//need to null terminate the string

reversed_string[length] ='\0';

returnreversed_string;

}

一半的時(shí)間,但復(fù)雜性相同(注意可能會(huì)因一個(gè)錯(cuò)誤而關(guān)閉)

如果傳遞了一個(gè)空指針,那么到目前為止提交的所有strlen()答案都將失敗——它們中的大多數(shù)會(huì)跳轉(zhuǎn)到立即調(diào)用一個(gè)可能的空指針——這可能會(huì)導(dǎo)致你的進(jìn)程出現(xiàn)段錯(cuò)誤。

許多答案都對(duì)性能著迷,以至于他們錯(cuò)過(guò)了問(wèn)題的關(guān)鍵問(wèn)題之一: reverse aconst char *,即您需要制作反向副本,而不是就地反向。如果需要副本,您會(huì)發(fā)現(xiàn)很難將迭代次數(shù)減半!

不需要臨時(shí)變量的方法

intlength = strlen(string);

for(inti =0; i < length/2; i++) {

string[i] ^=string[length - i] ^=string[i] ^=string[length - i];

}

字符串反轉(zhuǎn)到位,沒(méi)有臨時(shí)變量。

staticinlinevoid

byteswap(char*a,char*b)

{

? *a = *a^*b;

? *b = *a^*b;

? *a = *a^*b;

}

void

reverse(char*string)

{

char*end =string+ strlen(string) -1;

while(string< end) {

byteswap(string++, end--);

? }

}

它不會(huì)更有效,但是您可以通過(guò)將每個(gè)字母推入堆棧,然后將它們彈出到新分配的緩沖區(qū)中來(lái)展示數(shù)據(jù)結(jié)構(gòu)的知識(shí)。

這將需要兩次通過(guò)和一個(gè)臨時(shí)堆棧,但我可能會(huì)更相信自己第一次就能做到這一點(diǎn),然后不會(huì)像上面那樣犯一個(gè)錯(cuò)誤。

char*stringReverse(constchar* sInput)

{

std::size_tnLen =strlen(sInput);

std::stack charStack;

for(std::size_ti =0; i < nLen; ++i)

? ? {

charStack.push(sInput[i]);

? ? }

char* result =newchar[nLen +1];

std::size_tcounter =0;

while(!charStack.empty())

? ? {

result[counter++] = charStack.top();

charStack.pop();

? ? }

result[counter] ='\0';

returnresult;

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容