這哥們兒面試失意,就來找我訴苦:“面試題目太變態了。比如有家公司,讓我用5種程式設計方法實現字串反轉,整個面試我都在懵逼中度過的!”
嘖嘖~這明顯是基礎不夠扎實呀!區區5種方法,那可是信手拈來!下麵就開始我的表演!~
作者:聚聚
來源:資料團學社(ID:metrodata_xuexi)
方法01 反轉串列法
a = 'abcdef'
b = list(a)
b.reverse()
b = ''.join(b)
print(b)
Python中,串列可以進行反轉,我們只要把字串轉換成串列,使用reverse()方法,進行反轉,然後再使用字串的join()方法遍歷串列,合併成一個字串。
方法02 迴圈反向迭代法
a = 'abcdef'
b = ''
for i in a:
b = i + b
print(b)
字串屬於序列的一種,我們可以使用for迴圈遍歷字串,然後,不斷反向賦值給變數b,最後輸出變數b,就完成了字串反轉。
方法03 反向迴圈迭代法
a = 'abcdef'
b = ''
for i in a[::-1]:
#b = b + i
b += i
print(b)
字串本身就可以進行切片,當然也可以設定步長為-1,進行倒序。然後,再進行遍歷,迭代變數b,也可以達到反轉效果,邏輯和方法二相同。
方法04 倒序切片法
a = 'abcdef'
b = a[::-1]
print(b)
方法二和方法三的終極版本,直接反轉,一步到位。
方法05 遍歷索引法
a = 'abcdef'
b = ''
for i in range(1,len(a)+1):
b = b + a[-i]
print(b)
字串作為序列,可以進行索引,我們先遍歷索引數字,然後倒序提取字母,然後合併成字串。
方法06 串列彈出法
a = 'abcdef'
a = list(a)
b = ''
while len(a) > 0:
b = b + a.pop()
print(b)
串列有一種彈出的方法pop(),彈出其中某個元素,預設為最後一個元素。我們設定變數b,然後不斷彈出字串的最後一個字元,加入變數b中,最終使得字串反轉。
方法07 串列解析式法
a = 'abcdef'
b = ''.join(i for i in a[::-1])
print(b)
方法三的簡便寫法,使用串列解析式,簡化程式碼書寫。最後同樣透過join()方法,反轉合併字串。
方法08 反向遍歷索引法
a = 'abcdef'
b = ''.join(i for i in a[::-1])
print(b)
range()函式有三個引數:start,end,step,且左閉右開,我們從最後一個索引開始,最開始的索引結束,倒序遍歷索引,然後反向提取字串,最後合併。是方法五的逆向思維。
方法09 累積相加法
a = 'abcdef'
from functools import reduce
def f(x,y):
return y + x
b = reduce(f,a)
print(b)
使用python中的reduce()函式。先建立一個字串倒序相加函式和字串,一起傳入reduce函式中,執行,就可以進行字串倒序累積相加,最後反轉字串。
方法10 匿名函式法
a = 'abcdef'
b = reduce(lambda x,y:y+x,a)
print(b)
方法九的進階版,使用lambda匿名函式建立字串倒序相加函式,然後進行累積,得到字串反轉結果。
方法11 串列倒序法
a = 'abcdef'
a = list(a)
a.sort(reverse=True)
b = ''.join(a)
print(b)
用串列的sort(reverse=True)方法,倒序排列,不過,這一方法有個弊端,它並不是按字串的順序進行升序或降序排列,而是按英語26個字母進行排序,所以,如果字串不是按從小到大排列,那麼執行後,排序會是錯誤的。
方法12 雙向佇列排序法
a = 'abcdef'
import collections
b = collections.deque()
for i in a:
b.appendleft(i)
b = ''.join(b)
print(b)
使用雙向佇列進行操作。解釋下雙向佇列,這是一個資料結構,但可以方便的向序列的兩邊進行新增,刪除元素。我們遍歷字串,向左新增入雙向佇列中,最後使用join()方法合併,使字串反轉。
方法13 雙向佇列反轉法
a = 'abcdef'
b = collections.deque()
b.extend(list(a))
b.reverse()
b = ''.join(b)
print(b)
同樣使用雙向佇列,把字串轉換成串列新增入佇列中,然後整個進行反轉,最後合併匯出。
方法14 一維陣列索引法
a = 'abcdef'
import pandas as pd
b = pd.Series(list(a))
b = ''.join(b[::-1])
print(b)
使用pandas的一維陣列結構,對其倒序遍歷,反轉字串。
方法15 函式遞迴法
a = 'abcdef'
def f(a):
if len(a) <= 1:
return a
return a[-1] + f(a[:-1])
b = f(a)
print(b)
使用遞迴的思想,建立函式,倒序新增字串,直到字串長度小於等於1以後停止。
方法16 對稱交換法
a = 'abcdef'
def f(a):
a = list(a)
if len(a) <=1:
return a
i = 0
length = len(a)
while i length/2:
a[i],a[length - 1 - i] = a[length - 1 - i],a[i]
i += 1
return ''.join(a)
b = f(a)
print(b)
這是最為銷魂的一個方法~大體思路是遍歷字串前一半的元素,然後和後一半對稱的那個位置的元素進行交換,以達到字串反轉。過程非常講究邏輯~
看了我的展示以後,小夥伴又開始摩拳擦掌,躍躍欲試,對以後的面試充滿了信心。傳說,只要掌握了這16種方法,就能披荊斬棘,走向人生巔峰。