algo. 字符串之字符串反轉

開始的話:
每天三道題,養成良好的思維習慣。
一位愛生活愛技術來自火星的程序汪

這個題是什麼意思呢?就是給定一組字符串比如:abcdefg'abcdefg ',要求將前33個字母移動到字符串的後面去,也就是會得到defgabc'defgabc'。是不是很簡單,很好理解。

做了一些算法題之後(本來準備說做了很多算法題的,後來想了一下和一些大佬們動不動就刷了300400300-400的相比都不好意思開口),很重要的一件事情就是將問題簡單化,由易到難,分治等這些思想尤爲關鍵。不要直接上來就想一步到位(這些只有那些你看不懂他算法代碼的傢伙才能做到吧,也是一個不斷積累的過程。),慢慢來,誰讓我比較笨呢!

okok, 開始吧!

和描述中所述一次移動三個似乎有很多數組移動的情況,好像很不好一下就想到怎麼去很優雅的寫出來(發現自己進入了一個誤區,每次總是想很優雅的直接寫出代碼,最後才發現是慢慢改動代碼才優雅的,果然還是要一步一步來,不能心急。)。那就簡單來吧!三個不行我們就只移動一個好吧:就是把字符串中第一個字符aa移動到字符串末尾bcdefga'bcdefga ',這個還是比較好做的對吧,一個一個向前替換,需要單獨記錄第一個字符。話不多說上代碼:

def rotate(s: list, length: int) -> list:
    """
    反轉一個字符
    :param s:           輸入字符串數組
    :param length:      字符串長度
    :return:            返回反轉後的字符串
    """
    first = s[0]
    for i in range(1, length):
        #   從第二個開始逐一替換掉前一個的值
        s[i - 1] = s[i]
    #   給第一個值賦值到最後下標位置
    s[length - 1] = first
    return s

soso easyeasy 吧,那麼反轉三個呢?是不是就很簡單了,讓上面的循環三次就好了,哈哈,我真聰明!

for i in range(3):
    rotate(s, 7)
print(s)

但是呢,這並沒有完,做算法題最重要的是什麼?沒錯就是 時間複雜度空間複雜度 的分析。對於上面這樣的做法,這兩個指標分別是多少呢?
時間複雜度 -> O(nm)O(n*m) nn就表示前幾個字符需要反轉。mm就是字符串數組的長度了。
空間複雜度 -> O(1)O(1) 只存儲了一個變量firstfirst

對於空間複雜度還是很滿意的,但是時間複雜度就似乎有點高了,每次都遍歷了整個數組,這還是很恐怖的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章