開始的話:
每天三道題,養成良好的思維習慣。
一位愛生活愛技術來自火星的程序汪
這個題是什麼意思呢?就是給定一組字符串比如:,要求將前個字母移動到字符串的後面去,也就是會得到。是不是很簡單,很好理解。
做了一些算法題之後(本來準備說做了很多算法題的,後來想了一下和一些大佬們動不動就刷了的相比都不好意思開口),很重要的一件事情就是將問題簡單化,由易到難,分治等這些思想尤爲關鍵。不要直接上來就想一步到位(這些只有那些你看不懂他算法代碼的傢伙才能做到吧,也是一個不斷積累的過程。),慢慢來,誰讓我比較笨呢!
, 開始吧!
和描述中所述一次移動三個似乎有很多數組移動的情況,好像很不好一下就想到怎麼去很優雅的寫出來(發現自己進入了一個誤區,每次總是想很優雅的直接寫出代碼,最後才發現是慢慢改動代碼才優雅的,果然還是要一步一步來,不能心急。)。那就簡單來吧!三個不行我們就只移動一個好吧:就是把字符串中第一個字符移動到字符串末尾,這個還是比較好做的對吧,一個一個向前替換,需要單獨記錄第一個字符。話不多說上代碼:
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
吧,那麼反轉三個呢?是不是就很簡單了,讓上面的循環三次就好了,哈哈,我真聰明!
for i in range(3):
rotate(s, 7)
print(s)
但是呢,這並沒有完,做算法題最重要的是什麼?沒錯就是 時間複雜度 和 空間複雜度 的分析。對於上面這樣的做法,這兩個指標分別是多少呢?
時間複雜度 -> 就表示前幾個字符需要反轉。就是字符串數組的長度了。
空間複雜度 -> 只存儲了一個變量。
對於空間複雜度還是很滿意的,但是時間複雜度就似乎有點高了,每次都遍歷了整個數組,這還是很恐怖的。