有100盞燈,依次編號1-100,初始都是關着的。第1次遍歷,打開所有的燈;第2次遍歷,關掉第2盞、第4盞等被2整除的燈;第3次打開被3整除的燈;第i次,對被i整除的燈作以下操做面試
若是燈開着,就關掉算法
若是燈關着,就打開數組
如此交替進行,知道100次遍歷完畢,請問,還有多少盞燈亮着。微信
=============================================spa
原題排序
給定數組A,大小爲n,數組元素爲1到n的數字,不過有的數字出現了屢次,有的數字沒有出現。請給出算法和程序,統計哪些數字沒有出現,哪些數字出現了多少次。可以在O(n)的時間複雜度,O(1)的空間複雜度要求下完成麼?ip
分析hash
這個題目,是有必定技巧的。技巧是須要慢慢積累,待經驗多了以後,能夠靈感或者直覺,就產生了技巧。若是不知道技巧,那該怎麼辦呢? 在開始分析以前,說明兩個問題:io
原數組是沒有排序的。若是排序了,很簡單的。變量
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發佈,原創@陳利人 ,歡迎你們繼續關注微信公衆帳號「待字閨中」。