前言
來(lái)啦老鐵!
今天記錄一下最近遇到的幾個(gè)算法相關(guān)的題目,也可能算不上算法,只能算是巧妙的解題方法,一起來(lái)瞅一瞅吧~
題目
給定任意數(shù)字,要求能按順序輸出每一位,例如8763,要能依次輸出8、7、6、3;
給定任意英語(yǔ)字符串,要求能輸出用該字符串中所有字母組合而成的字符串,例如給定god要能輸出god, gdo, ogd, odg, dog, dgo;
給定一組數(shù)據(jù),要求能按間隔輸出該數(shù)據(jù),最終將所有數(shù)據(jù)輸出,例如給定["test1", "test2", "test3", "test4", "test5", "test6", "test7"],假定按間隔2輸出,則輸出順序?yàn)椋簍est1、test4、test7、test5、test3、test6、test2;
接下來(lái)咱們一一完成;
題目1
(給定任意數(shù)字,要求能按順序輸出每一位,例如8763,要能依次輸出8、7、6、3)
def test(number):
if number // 10 > 0:
test(number // 10)
print(number % 10)
if __name__ == '__main__':
test(8763)

以上的題目和解題方法是在數(shù)據(jù)結(jié)構(gòu)與算法書籍中看到的,用到了遞歸的思想,很是巧妙;
筆者在寫這篇文章的時(shí)候,想到了一個(gè)簡(jiǎn)單的方式,也可以參考一下:
def test(number):
number_string = number.__str__()
for s in number_string:
print(s)
if __name__ == '__main__':
test(8763)
一樣也是可以解題的,遞歸本質(zhì)上也是一種循環(huán);
題目2
(給定任意英語(yǔ)字符串,要求能輸出用該字符串中所有字母組合而成的字符串,例如給定god要能輸出god, gdo, ogd, odg, dog, dgo)
這道題曾經(jīng)讓我廢寢忘食了一個(gè)中午,最后百度后,成功解開(kāi):
def test(str):
word_length = len(str)
if word_length <= 1:
return [str]
str_list = []
for i in range(word_length):
for j in test(str[0:i] + str[i + 1:]):
str_list.append(str[i] + j)
return str_list
if __name__ == '__main__':
print(test("dog"))

沒(méi)錯(cuò),又是一個(gè)巧妙的遞歸題目,筆者隔了幾個(gè)禮拜,第二次寫還是寫不出來(lái),太菜了,要記錄一下~
后面發(fā)現(xiàn)有另外一種現(xiàn)成的辦法,也可以實(shí)現(xiàn),厲害了:
import itertools
res = []
def test(word):
for w in itertools.permutations(word, 3):
res.append(''.join(w))
print(res)
if __name__ == '__main__':
test("dog")

題目3
(給定一組數(shù)據(jù),要求能按間隔輸出該數(shù)據(jù),最終將所有數(shù)據(jù)輸出,例如給定["test1", "test2", "test3", "test4", "test5", "test6", "test7"],假定按間隔2輸出,則輸出順序?yàn)椋簍est1、test4、test7、test5、test3、test6、test2)
這道題,從某些渠道了解到,可以用循環(huán)鏈表輕松實(shí)現(xiàn),不過(guò)python沒(méi)有鏈表,因此,我自己用自己的思路解了下題目:
queued = []
def test(queue, step, startIndex=0):
if len(queue) <= 1:
queued.extend(queue)
return
leftList = []
leftListStartIndex = 0
for i, v in enumerate(queue):
if (i + startIndex) % (step + 1) == 0:
queued.append(v)
leftListStartIndex = len(queue) - i
continue
leftList.append(v)
test(leftList, step, leftListStartIndex)
if __name__ == '__main__':
q = ["test1", "test2", "test3", "test4", "test5", "test6", "test7"]
test(q, 2)
print("original:", q)
print("queued:", queued)

你沒(méi)看錯(cuò),又用遞歸實(shí)現(xiàn)了~
遞歸有幾個(gè)特點(diǎn):
(準(zhǔn)備從數(shù)據(jù)結(jié)構(gòu)與算法書籍中抄一下)
有時(shí)候表面看起來(lái)挺簡(jiǎn)單的問(wèn)題,其實(shí)蘊(yùn)含深意,就像這幾道題,特別是第2道題,這得多聰明的腦袋?愿你我有越來(lái)越聰明的腦袋~

如果本文對(duì)您有幫助,麻煩動(dòng)動(dòng)手指點(diǎn)點(diǎn)贊?
謝謝!