巧解一道階乘排序題

2021-08-16 12:11:39 字數 2345 閱讀 9102

今天,介紹一道在本計算機考試書上的階乘排序(就是將乙個列表長度的階乘種的方式的排列組合輸出)題。

下面我們直接看題:

在1~49中任意選擇7個數,將這7個數的所有排列可能性全部輸出。例如:[1,2,3]的所有輸出有[2,1,3];[2,3,1];[3,2,1];[3,1,2];[1,3,2];[1,2,3].

這道題的關鍵是要找到乙個排序的規律,在這裡我不介紹各種排序的演算法了(其實我也不是很懂o(╥﹏╥)o),只講自己觀察出來的一種規律。

首先,讓我們把[1,2,3]的排序所有可能寫下來:

這下,我們就能很容易看到這個規律了,其實,只要我們遇到這類題目,使用列舉法或假設法都很好的解決問題。正如題目要求的7個,但是,這裡我們使用3個數來理解這個問題就變得很簡單了。下面我們再來看一張圖,就了解這個規律了:

我們只關注一件事,「1」它怎麼變動的,我們就能很容易的知道如何解決這道題了。其實,就是簡單的將前乙個數與後乙個數交換位置。且這種交換是迴圈的,意思是當「1」從頭交換到了尾就是乙個迴圈,因為,它沒有辦法再繼續這種交換了。然後,它再從尾交換到頭,實現第二個迴圈。到此,我們已經明白這個規律了。

但是,還有乙個問題,怎麼確定不同的排序的迴圈呢?

然後,我們再來延伸,同樣尋找規律。在分別列出了2、3、4、5個數時,它的迴圈數。

咋一看感覺是沒有什麼規律,但是,當我們將每個數的階乘寫出來了,就可以看出來其實規律還是挺容易發現的。

現在,我們就將這道題的乙個規律找出來了,下面,我們就用**來實現它:

# 首先要匯入reduce累積函式,因為我使用的是python3,所以在functools庫中。

from functools import reduce

# 定義乙個兩兩交換的排序函式。

defsort_two

(lis):

length = len(lis)

# 定義乙個迴圈初始值

count = 1

# 計算階乘

counts = reduce(lambda x, y: x*y, range(1, length+1))

# 計算迴圈數

lim = counts/(length-1)

while count <= lim:

count += 1

ifnot isinstance(lis, list):

return

"please number in list"

for i in range(length-1):

one = lis[i]

two = lis[i+1]

lis[i] = two

lis[i+1] = one

print(lis)

if __name__ == "__main__" :

lis = [1, 2, 3, 4]

sort_two(lis=lis)

輸出結果:

[2, 1, 3, 4]

[2, 3, 1, 4]

[2, 3, 4, 1]

[3, 2, 4, 1]

[3, 4, 2, 1]

[3, 4, 1, 2]

[4, 3, 1, 2]

[4, 1, 3, 2]

[4, 1, 2, 3]

[1, 4, 2, 3]

[1, 2, 4, 3]

[1, 2, 3, 4]

[2, 1, 3, 4]

[2, 3, 1, 4]

[2, 3, 4, 1]

[3, 2, 4, 1]

[3, 4, 2, 1]

[3, 4, 1, 2]

[4, 3, 1, 2]

[4, 1, 3, 2]

[4, 1, 2, 3]

[1, 4, 2, 3]

[1, 2, 4, 3]

[1, 2, 3, 4]

一道很有意思的規律題,感覺自己又回到了高中做數學找規律的題的時候,真是非常享受的一件事情(^▽^)。但是,自己關於演算法的學習也是冰山一角,再接再厲吧!

解谷歌的一道題

這幾天有一道google的面試題在論壇炒得很火,題目如下 有乙個100層高的大廈,你手中有兩個相同的玻璃圍棋子。從這個大廈的某一層扔下圍棋子就會碎,用你手中的這兩個玻璃圍棋子,找出乙個最優的策略,來得知那個臨界層面。下面給出我的分析和解答。為了得到兩個棋子的最優策略,我們先簡化問題,看看乙個棋子的情...

解一道遞迴呼叫題

int ack int m,int n ack 3,3 的輸出是什麼?假設我們將ack m,n 填充到乙個二維矩陣的第m行第n列,從函式中可以看出第m行第n列的資料依賴於第m 1行和第m行第n 1列的資料。根據if m 0 return n 1 可以填充第0行的資料為0,1,2,3,4,5,6,7....

解一道簡單的演算法題

原題是這樣的 乙個未排序整數陣列,有正負數,重新排列使負數排在正數前面,並且要求不改變原來的正負數之間相對順序。比如 input 1,7,5,9,12,15 ans 5,12,1,7,9,15 且要求時間複雜度o n 空間o 1 我實現的解法 解法1 不考慮時間和空間複雜度 則每次找到乙個正數,取出...