此起彼伏;及燈分析

紫鳳發表於2013-09-09

今日面試題:此起彼伏

有這樣一個陣列A,大小為n,相鄰元素差的絕對值都是1.如:

A={4,5,6,5,6,7,8,9,10,9}。

現在,給定A和目標整數t,請找到t在A中的位置。除了依次遍歷,還有更好的方法麼?

===================================================

燈分析

原題

有100盞燈,依次編號1-100,初始都是關著的。第1次遍歷,開啟全部的燈;第2次遍歷,關掉第2盞、第4盞等被2整除的燈;第3次開啟被3整除的燈;第i次,對被i整除的燈做如下操作

  • 如果燈開著,就關掉

  • 如果燈關著,就開啟

如此交替進行,直到100次遍歷完畢,請問,還有多少盞燈亮著。

分析

這個題目比較好玩兒,路子走對了,很簡單。想不對,方法就不是那麼美。

例如,方向不對的話,就按照題目的意思,一遍又一遍的遍歷,直到結束,時間複雜度是O(n^2)的。也能夠解決問題,但是複雜了。

那麼怎麼辦呢?上面的遍歷的做法,是橫向的思路,現在我們縱向思考。一盞燈,會在那幾次被操作。例如編號為100的燈:

  • 第1次能夠操作,開啟

  • 第2次能夠操作,關閉

  • 第4次能夠操作,開啟

  • 第5次能夠操作,關閉

  • 第10次能夠操作,開啟

  • 第20次能偶操作,關閉

  • 第25次能夠操作,開啟

  • 第50次能夠操作,關閉

  • 第100次能偶操作,開啟

最終編號為100的燈是開啟的。再來看編號為70這盞燈:

  • 第1次能夠操作,開啟

  • 第2次能夠操作,關閉

  • 第35次能夠操作,開啟

  • 第70次能夠操作,關閉

最終編號為70的燈關閉著。

通過上面兩個例子,我們會發現,1,2,4,5等都是能夠整除100;1,2,35,70都能夠整除70。 所以,編號為n的燈,有多少個因數,就有會被操作多少次。很顯然,如果是偶數次,則燈一定是關著的。 那什麼情況下,操作會是奇數次呢?一個數,每次分解,都是兩個數相乘,只有當這兩個數相同的時候,才會是偶數次。 所以,最終會亮著的燈,都能夠開平方,得到一個正整數:1,4,9,16,25,36,49,64,81,100.

【分析完畢】

本文來自微信:待字閨中,2013-08-30釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章