燈;及陣列統計分析
今日面試題:燈
有100盞燈,依次編號1-100,初始都是關著的。第1次遍歷,開啟全部的燈;第2次遍歷,關掉第2盞、第4盞等被2整除的燈;第3次開啟被3整除的燈;第i次,對被i整除的燈做如下操作
如果燈開著,就關掉
如果燈關著,就開啟
如此交替進行,知道100次遍歷完畢,請問,還有多少盞燈亮著。
=============================================
陣列統計分析
原題
給定陣列A,大小為n,陣列元素為1到n的數字,不過有的數字出現了多次,有的數字沒有出現。請給出演算法和程式,統計哪些數字沒有出現,哪些數字出現了多少次。能夠在O(n)的時間複雜度,O(1)的空間複雜度要求下完成麼?
分析
這個題目,是有一定技巧的。技巧是需要慢慢積累,待經驗多了之後,可以靈感或者直覺,就產生了技巧。如果不知道技巧,那該怎麼辦呢? 在開始分析之前,說明兩個問題:
原陣列是沒有排序的。如果排序了,很簡單的。
O(1)的空間含義,可以使用變數,但不能開闢陣列或者map等來計數。
這個題目,很直接的解法就是兩層遍歷,O(n^2)的複雜度,O(1)的空間。空間滿足了,但是時間沒有。 很多類似的題目,都會用XOR的方法,大家仔細想一下,這個題目,可以麼?或者這個題目和可以用XOR的題目的差異在哪兒?最直接的就是,每一個數字的重複的次數是不同的。
還有就是以空間換時間的方法,例如用hash map或者陣列來計數。時間滿足了,但是空間沒有滿足。 那怎樣才能有時間複雜度O(n),空間複雜度O(1)的演算法呢?不能開闢新的空間,那麼只剩下,重複利用陣列A。那麼該如何利用陣列A呢?
首先,我們介紹一種三次遍歷陣列的方法,我們都考慮陣列從0開始:
第一次遍歷:對於每一個A[i] = A[i] * n
第二次遍歷:對於每一個i,A[A[i]/n]++
第三次遍歷:對於每一個i,A[i] % n就是出現次數
A[i]應該出現在A中的A[i]位置,乘以n、再除以n,很容易的來回變換;第二次遍歷,對於A[i]本來所在的位置不斷增1,但絕對不對超出n的,那每一個i出現的次數,就是A[i]對n取餘。
還有一種兩次遍歷的方法,也是上面的思路:題目中陣列是1到n,為了方便演算法考慮,以及陣列儲存方便,我們考慮0-n-1,結果是相同的。 考慮A[i],現在位置是i,如果採用A來計數,它的位置應該是A[i] % n,找到計數位置,該如何處理這個位置呢?加1麼?顯然不可以,這裡有一個技巧,就是加n,有兩個原因
加n可以保證A[i] % n是不變的
A陣列,最後每一個元素表示為A[i] = x + k*n,其中x
上面的思路,轉換為程式碼如下:
【分析完畢】
本文來自微信:待字閨中,2013-08-29釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 陣列統計;及樹的高度分析陣列
- 陣列和;及此起彼伏分析陣列
- PHP原始碼陣列統計count分析PHP原始碼陣列
- 此起彼伏;及燈分析
- 查詢提示;及重排陣列分析陣列
- 又見排序;及陣列和分析排序陣列
- 重排陣列;及消失的數字分析陣列
- 找陣列的波谷;及巧妙排序的分析陣列排序
- 字母統計(陣列思維)陣列
- JS陣列方法總覽及遍歷方法耗時統計JS陣列
- 繩子的長度;及找陣列的波谷分析陣列
- JavaScript 陣列方法集合及示例!JavaScript陣列
- RAID磁碟硬陣列及安裝作業系統AI陣列作業系統
- 統計陣列個元素出現的個數陣列
- 統計陣列中各元素出現次數陣列
- 陣列(2)陣列運算及典例(求解素數的方法)陣列
- JAVA陣列的定義及用法Java陣列
- javascript的boolean及陣列的indexJavaScriptBoolean陣列Index
- shell 使用陣列及字串擷取陣列字串
- c語言陣列、sizeof()及strlen()C語言陣列
- PHP陣列學習之計算陣列元素總和PHP陣列
- 陣列及陣列物件操作 ----------包括排序,去重,合併,翻轉等陣列物件排序
- 陣列記憶體地址解讀及二維陣列的遍歷陣列記憶體
- 統計numpy陣列中最頻繁出現的值陣列
- Matlab統計陣列中相同元素的個數Matlab陣列
- numpy——陣列的計算陣列
- Java陣列(基本+記憶體分析)Java陣列記憶體
- 陣列效能問題分析總結陣列
- java陣列的記憶體分析Java陣列記憶體
- 二維陣列程式碼案例分析陣列
- [JAVA] Java 陣列、多維陣列,動態、靜態初始化,陣列JVM記憶體模型分析Java陣列JVM記憶體模型
- 《Java從入門到失業》第三章:基礎語法及基本程式結構(3.9):陣列(陣列基本使用、陣列的迴圈、陣列拷貝、陣列排序、多維陣列)Java陣列排序
- jquery裡遍歷普通陣列和多維陣列的方法及例項jQuery陣列
- php陣列轉換js陣列操作及json_encode應用PHP陣列JSON
- web統計資料蒐集及分析原理Web
- JavaSE 陣列:一維陣列&二維陣列Java陣列
- arraylist陣列元素插入及顯示示例陣列
- Linux Shell 陣列建立及使用技巧Linux陣列