字串的翻轉在日常開發使用程度比較少,但是面試過程中卻是常有的。最近看php 原始碼中strrev,因此寫一篇文記錄對字串翻轉問題的一些學習。
對於字串」hello word」 翻轉成」drow olleh」的問題,php有現成函式strrev可以解決。先看看php如何實現的
php_function(strrev)
n = zend_string_alloc(zstr_len(str), 0);
p = zstr_val(n);
e = zstr_val(str) + zstr_len(str);
while (--e >= zstr_val(str))
*p = '\0';
retval_new_str(n);
}
這其實對應一種解決方案。在乙個迴圈中,把字串從後往前複製到乙個新的變數中去,然後返回。時間復制度是o(n),空間復制度o(n)。
另一種方案則是在原有字串上做修改。分別設定兩個標記變數。分別從字串的前面,後面向中間靠攏,當兩個標記相遇則結束。時間復制度o(n),空間複雜度o(1)
$str = "hello word";
$i = 0;
$j = strlen($str)-1;
while ($i <$j)
網路上還有一種思路是使用異或運算交換兩個字元,abb = a,aba = b。其實跟第二種思路類似,只是改變了賦值操作,不引入臨時變數。這就跟」不引入其他變數,交換兩個變數的值」一樣(數值變數,或者等長度字串變數)
$str = "hello word";
$i = 0;
$j = strlen($str)-1;
while ($i <$j)
那麼對於問題」student. a am i」 翻轉成」i am a student.」這類問題呢?這種問題,單次本身的順序是正確的。單詞之間的順序是錯誤的。上面的問題處理單元是」字元」,而這裡的問題處理單元是」單詞」
這類字元翻轉有兩種辦法,乙個先使用strrev翻轉整個句子,然後再對裡面的單詞依次翻轉。
$str = "student. a am i";
$str = strrev($str);
$str = implode(' ', array_map(function($word), explode(' ', $str)));
第二類,則是直接調換單詞順序。
$str = "student. a am i";
$words = explode(' ', $str);
$i=0;
$j = count($words)-1;
while ($i <$j)
$str = implode(' ', $words);
字串問題 翻轉字串
題目 給定乙個字元型別的陣列chas,請在單詞間做逆序調整,只要做到單詞順序逆序即可,對空格的位置沒有特別要求。例如把chas看成字串為 i love you 調整成 you love i 補充題目 給定乙個字元型別的陣列chas和乙個整數size,請把大小為size的左半區整體移到右半區,右半區整...
演算法 字串問題 翻轉字串
翻轉字串 給定乙個字元型別的陣列chas,請在單詞間作逆序調整。只要做到單詞順序逆序即可。例如,如果看成字串 dog loves pig 則調整為 pig loves dog 過程 先整體逆序,在區域性單詞逆序 public static void rotateword char chas reve...
翻轉字串 翻轉單詞字串
將一句話裡面的單詞進行倒置,標點符號不倒換。比如一句話 i come from china.倒換後變成 china.from come i 解析 解決該問題可以分為兩步,第一步全盤置換為 anihc morf emoc i 第二部對每個單詞進行逐步翻轉,如果不是空格,則開始翻轉單詞。具體 如下 in...