1. 程式人生 > >九章演算法面試題38 洗牌的技巧

九章演算法面試題38 洗牌的技巧

九章演算法官網-原文網址


題目

有一副撲克有2n張牌,用1,2,..2*n代表每一張牌,一次洗牌會把牌分成兩堆,1,2..n和n+1...2n。然後再交叉的洗在一起:n+1, 1, n+2, 2, … n, 2n。問按照這種技巧洗牌,洗多少次能夠洗回撲克最初的狀態:1,2,...2n。


解答

以1 2 3 4 5 6為例,洗一次之後為4 1 5 2 6 3 。將兩排陣列對比看:

1 2 3 4 5 6

4 1 5 2 6 3

數字1的下面是4,代表每一次洗牌後1這個位置的數會被4這個位置的數替代,接著看數字4,4下面是2,代表每一次洗牌後4這個位置的數會被2替代,再看2,2下面是1,2這個位置的數字會被1替代。此時,1 4 2形成一個環,代表這三個位置上的數再每一次洗牌後,迴圈交替,並且在洗3次以後,各自回到最初的位置。用同樣的方法可以找到3 5 6是一個迴圈,迴圈節長度為3。由此可以知道,在經過了LCM(3,3)=3次洗牌後,所有數都回到原位,這裡LCM是最小公倍數的意思。於是演算法為,根據一次洗牌的結果,找到所有的迴圈節,答案為所有迴圈節長度的最小公倍數。

面試官角度

這個題目的考察點在於找規律。不過如果有一定置換群的理論基礎的同學,是可以比較輕鬆的解決這個問題的。有興趣的同學可以檢視離散數學的相關書籍中置換群的知識點。

相關推薦

演算法試題38 技巧

九章演算法官網-原文網址 題目 有一副撲克有2n張牌,用1,2,..2*n代表每一張牌,一次洗牌會把牌分成兩堆,1,2..n和n+1...2n。然後再交叉的洗在一起:n+1, 1, n+2, 2, … n, 2n。問按照這種技巧洗牌,洗多少次能夠洗回撲克最初的狀態:1,2

演算法試題77 插入區間

原網址: 問題詳情  給出一個無重疊的按照區間起始端點排序的區間列表。 在列表中插入一個新的區間,你要確保列表中的區間仍然有序且不重疊(如果有必要的話,可以合併區間)。線上評測本題: http://www.lintcode.com/zh-cn/problem/insert

演算法試題1 落單的數

九章演算法官網-原文網址: 題目 初階:有2n+1個數,其中2n個數兩兩成對,1個數落單,找出這個數。要求O(n)的時間複雜度,O(1)的空間複雜度。 進階:如果有2n+2個數,其中有2個數落單,該怎麼辦? 線上測試本題 解答 初階:將2n+1個數異或起來,相同的數會

演算法試題61 克隆圖

九章演算法官網-原文網址 題目 給出一個圖,並且給出圖的起始節點,知道這個圖的節點的定義,要求克隆這個圖,返回克隆圖的起始節點。 線上測試本題 解答 這一類克隆一個圖的題目,我們都可以分為兩步。 第一步: 克隆點。 只需要用廣度優先搜尋的方法從根節點出發去遍歷一遍圖,

演算法——試題思路

面試題1 落單的數 題目描述: 有2n+1個數,其中2n個數兩兩成對,1個數落單,找出這個數。要求O(n)的時間複雜度,O(1)的空間複雜度。進階問題:如果有2n+2個數,其中有2個數落單,該怎麼辦? 答: 初階:將2n+1個數異或起來,相同的數會抵消,異或的答

演算法試題80 接雨水

原文網址: 問題詳情  給出 n 個非負整數,代表一張X軸上每個區域寬度為 1 的海拔圖, 計算這個海拔圖最多能接住多少(面積)雨水線上評測本題: http://www.lintcode.com/zh-cn/problem/trapping-rain-water/解答 

演算法試題32 小球排序

九章演算法官網-原文網址 題目 有紅黃藍三色的小球若干排成一列,這些小球進行排序,請使用盡量少的空間和時間。解答 假設順序為紅色黃色藍色。用兩根指標從頭開始遍歷,第一根指標遇到非紅色時停下,如果第二根指標找到第一根指標之後的第一個紅色停下,交換兩根指標所指顏色。重複上述過

演算法試題66 2 sum

九章演算法官網-原文網址 題目 給一堆陣列和一個目標值,在這堆數組裡面找出兩個數使得他們的和等於目標值。 線上測試本題 http://www.lintcode.com/en/problem/2-sum/ 解答 如果原題的陣列中第i個元素我們用ai來表示,目標值我們用v來

演算法試題56 最近公共祖先

九章演算法官網-原文網址 題目 給出一棵二叉樹和兩個二叉樹上的節點,求出這兩個點的最近公共祖先(Lowest Common Ancestor, LCA)。 如下面這棵二叉樹:           1         /    \        2     3    

演算法試題45 尋找最大的儲水容器

九章演算法官網-原文網址 題目 給定一個正整數陣列(a0,a1..),分別代表n個座標(0,a0), (1,a1),根據這n個點畫出n條線段,每條線段的兩個端點分別為(i, ai)和(i, 0)。找到兩條線段,使得這兩條線段和x軸所構成的容器儲水容量最大。如[2,1,3]

演算法試題87 最小子陣列

原文網址 問題詳情  給定一個整數陣列,找到一個具有最小和的子陣列。返回其最小和。線上評測本題: http://www.lintcode.com/zh-cn/problem/minimum-subarray/解答  這道題和max subarray很類似,我用local

演算法試題79 尋找峰值

原文網址: 問題詳情  你給出一個整數陣列(size為n),其具有以下特點: 相鄰位置的數字是不同的 A[0] < A[1] 並且 A[n - 2] > A[n - 1] 假定P是峰值的位置則滿足A[P] > A[P-1]且A[P] > A[P

[經典試題]完美演算法

題目 有個長度為2n的陣列{a1,a2,a3,…,an,b1,b2,b3,…,bn},希望排序後{a1,b1,a2,b2,….,an,bn},請考慮有無時間複雜度o(n),空間複雜度0(1)的解法。 來源 2013年UC的校招筆試題 思路一 第①步、確

演算法 | Facebook 試題 : Backpack VI 揹包演算法

2017-12-21 題目描述 給一個nums[]陣列,如[1, 2, 4] 將這些數組合使得: 這些數的和是給出的一個target,如使這些數的和等於4,求這樣的組合有多少個? 樣例 樣例

lintcode&演算法——Microsoft 試題 | 我能贏 ? 待解決

題目描述 有兩個人玩一個遊戲,給定一個最大可取整數 maxChoosableInteger,兩個人輪流從1~maxChoosableInteger 中取一個數,取過的數不可再取,若其中一方取過以後, 所有取過的數加起來的和大於等於desiredTotal,那

前端常見演算法試題之 - 從尾到頭列印連結串列[JavaScript解法]

前端常見演算法面試題之 - 從尾到頭列印連結串列[JavaScript解法] 題目描述 實現思路 程式碼實現 題目描述 輸入一個連結串列的頭結點,從尾到頭反過來打印出每個結點的值 實現思路 前端工程師看到這個題目,直接想到的就是

前端常見演算法試題之 - 二維陣列中的查詢[JavaScript解法]

前端常見演算法面試題之 - 二維陣列中的查詢[JavaScript解法] 題目描述 輸入輸出分析 實現思路 程式碼實現 題目描述 在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個

演算法筆記 5.深度優先搜尋 Depth First Search

DFS cs3k.com 什麼時候用dfs? 短, 小, 最問題 而90%DFS的題, 要麼是排列, 要麼是組合 組合搜尋問題 Combination 問題模型:求出所有滿足條件的“組合” 判斷條件:組合中的元素是順序無關的 時間複雜度:與 2^n 相關 遞迴三要素 一般來說,如果面試官不特

演算法筆記 4.寬度優先搜尋 Breadth First Search

演算法與題型 cs3k.com DFS: 用於搜尋, 題目中有ALL字樣 二分法: 用於時間複雜度小於O(n)的情況 分治法: 二叉樹問題, 子問題和父問題有關係 BFS:- 二叉樹上的寬搜- 圖上的寬搜: 拓撲排序- 棋盤上的寬搜   什麼時候應該用BFS? 圖

演算法筆記 3.二叉樹與分治演算法Binary Tree & Divide Conquer

大綱 cs3k.com • 時間複雜度訓練 II • 二叉樹的遍歷演算法 Traverse in Binary Tree Preorder / Inorder / Postorder • 二叉樹的深度優先搜尋 DFS in Binary Tree 1.遍歷問題 Preorder