簡單聊聊字串的翻轉問題

2021-09-11 14:41:35 字數 1416 閱讀 4667

字串的翻轉在日常開發使用程度比較少,但是面試過程中卻是常有的。最近看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...