這是網路流傳的
microsoft
的面試題目之一:「編寫反轉字串的程式,要求優化速度、優化空間」。因為最近一直很多關注演算法方面的實踐和研究,因此對這個問題進行了一些思考,給出了
5種實現方法(有兩種解法相關性比較大)。
解法一:第一次看到這題目,想到最簡單、最直覺的解法就是:遍歷字串,將第乙個字元和最後乙個交換,第二個和倒數第二個交換,依次迴圈,即可,於是有了第乙個解法:
char* strrev1(const char* str)
return tmp;
}這裡是通過陣列的下標方式訪問字串的字元,實際上用指標直接操作即可。解法二正是基於此,實現**為:
char* strrev2(const char* str)
return ret;
}顯然上面的兩個解法中沒有考慮時間和空間的優化,乙個典型的優化策略就是兩個字元交換的演算法優化,我們可以完全不使用任何外部變數即完成兩個字元(或者整數)的交換,這也是乙個很經典的面試題目。特別是一些嵌入式硬體相關程式設計中經常要考慮暫存器的使用,因此經常有不使用任何第三個暫存器即完成兩個暫存器資料的交換的題目。一般有兩個解法,對應這裡的解法三和解法四。
解法三的實現**為:
char* strrev3(const char* str)
return ret;
}解法四
的實現**為:
char* strrev4(const char* str)
return ret;
}實際上我們還可以通過遞迴的思想來解決這個問題,思想很簡單:每次交換首尾兩個字元,中間部分則又變為和原來字串同樣的問題,因此可以通過遞迴的思想來解決這個問題,對應解法五的實現**為:
char* strrev5(/*const */char* str,int len)
以下給出乙個測試程式:
int main(int argc,char* argv)
你就可以看到字串
"hello"
和"olleh"
交替輸出了。
說明:1
)這裡解法中沒有認真考慮輸入字串的合法性和特殊長度(如
null
、乙個字元等)字串的處理;2)前
4個演算法不改變輸入字串的值,解法五修改了輸入字串
面試題58 反轉字串
題目一 翻轉單詞順序 牛客最近來了乙個新員工fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事cat對fish寫的內容頗感興趣,有一天他向fish借來翻看,但卻讀不懂它的意思。例如,student.a am i 後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是 i am...
字串反轉的面試題,你會嗎?
不用申請記憶體空間,把乙個字串做反正操作。比如說 str abcdefg res gfedcba 這個比較簡單,只要做前後字元交換就可以了 func reverse str byte 第二階段 不用申請記憶體,如何把每個單詞做反轉,假設單詞中間只有乙個空格 比如說 str php is the be...
字串高頻面試題。
一 題目 把乙個01 只包含0和1的串 串進行排序。可以交換任意兩個位置,求最少交換的次數。方法 仿造快速排序裡面的partition的過程。最左邊的0和1是沒有意義的,從左到右掃到第乙個1,從右到左掃到第乙個0,然後交換,然後繼續掃下去,就ok啦。include include define ma...