你會如何改進這個演算法?

itchaindev發表於2022-04-05

問題

通過我在網上找到的一些程式設計面試挑戰,我不得不編寫一個演算法來反轉 const char * 並返回一個指向新 char * 的指標。我想我有它,但為了讓它正常工作,我不得不做一些奇怪的事情——基本上必須自己考慮空終止字元。不知何故,我覺得這是錯誤的,但我很難過,我想知道是否有人可以幫助我:

char * reverse(const char * str)
{
int length = strlen(str);
char * reversed_string = new char[length+1];
for(int i = 0; i < length; ++i)
{
reversed_string[i] = str[(length-1) - i];
}
//need to null terminate the string
reversed_string[length] = '\0';
return reversed_string;
}
int main(int argc, char * argv[])
{
char * rev_str = reverse("Testing");
cout << "Your string reversed is this: " << rev_str << endl;
delete rev_str;
rev_str = 0;
return 0;
}

解決方案

    上面的 for 迴圈有錯字。檢查迴圈變數 i 應該是 <= 而不是 <,否則對於奇數個元素將失敗。for(int i = 0; i <= 長度/2; ++i)

    char * reverse(const char * str)
    {
    if (!str)
    return NULL;
    int length = strlen(str);
    char * reversed_string = new char[length+1];
    for(int i = 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';
    return reversed_string;
    }

    一半的時間,但複雜性相同(注意可能會因一個錯誤而關閉)

    如果傳遞了一個空指標,那麼到目前為止提交的 所有 strlen()答案都將失敗——它們中的大多數會跳轉到立即呼叫一個可能的空指標——這可能會導致你的程式出現段錯誤。

    許多答案都對效能著迷,以至於他們錯過了問題的關鍵問題之一: reverse a  const char *,即您需要製作反向 副本,而不是就地反向。如果需要副本,您會發現很難將迭代次數減半!

    不需要臨時變數的方法

    int length = strlen(string);for(int i = 0; i < length/2; i++) {string[i] ^= string[length - i] ^= string[i] ^= string[length - i];}

    字串反轉到位,沒有臨時變數。

    static inline voidbyteswap (char *a, char *b){*a = *a^*b;*b = *a^*b;*a = *a^*b;}voidreverse (char *string){char *end = string + strlen(string) - 1;while (string < end) {byteswap(string++, end--);}}

    它不會更有效,但是您可以通過將每個字母推入堆疊,然後將它們彈出到新分配的緩衝區中來展示資料結構的知識。

    這將需要兩次通過和一個臨時堆疊,但我可能會更相信自己第一次就能做到這一點,然後不會像上面那樣犯一個錯誤。

    char* stringReverse(const char* sInput){std::size_t nLen = strlen(sInput);std::stack<char> charStack;for(std::size_t i = 0; i < nLen; ++i){charStack.push(sInput[i]);}char * result = new char[nLen + 1];std::size_t counter = 0;while (!charStack.empty()){result[counter++] = charStack.top();charStack.pop();}result[counter] = '\0';return result;}

    原文連結: https://www.chaindev.cn/219420-how-would-you-improve-this-algorithm-c-string-reversal/


    來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016198/viewspace-2885700/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章