3.在黑板上寫下50個數字:1至50。在接下來的49輪操作中,每次做如下操作:選取兩個黑板上的數字a和b,擦去,在黑板上寫|b-a|。請問最後一次動作之後剩下的數字可能是什麼?為什麼?(不用寫**,不寫原因不得分)(阿里巴巴筆試題)
將題目通用化,即變成給定1..n這n個數字,操作到最後剩下的數字可能是什麼。則原題即是n=50的特例。
首先我們有結論1:假設操作1..n,最後剩下的可能數字的個數為k,則操作1..(n+1)時,剩下數字的個數將大於等於k。這個結論簡單的用反證法證明下——假設存在n,使得操作1..n時,剩下的數字個數k,操作1..(n+1)剩下可能數字的個數為p,且k>p。則令1..n時的k個數為a[1],a[2]…a[k],顯然它們互不相等。則1..n+1時,如果最後使用數字n+1與a[1]…a[k]做操作,得到|a[1]-(n+1)| … |a[k]-(n+1)|,此時k=p,不滿足假設,則假設不成立,原命題成立。
然後再來個結論2:操作1..n所有可能剩下的數字必定都小於等於n。這個顯然成立,因為對任意非負數a,b,|b-a|<=max(a,b)必定成立。
開始解題。
對於操作1..n這n個數,若只觀察它們的奇偶性,則會發現,當選取任意兩個數a,b做操作時,若兩個均為偶數,則結果也為偶;兩個奇數,結果為偶;一奇一偶,結果為奇。而這點跟異或完全相同,即令0代表偶數,1代表奇數,則0^0=1^1=0,0^1=1^0=1。因此,當操作1..n時,其剩下數字的奇偶性就等於1^0^1^0…^1(n為奇)/0(n為偶),是個確定值,即剩下的數必定都為奇數或都為偶數(異或與順序無關)。進一步發現,當1^0^1^0…式子中1的個數為奇數時,結果為1,即剩下的數必定都為奇數;1的個數為偶,結果為0,剩下的數字必定都為偶數。
因此我們有如下假設的結論:對於1..n,當┌n/2┐為奇數(┌n┐表示不小於n的整數)時,剩下的數字為1,3,5… 2i+1(其中2*i+1為小於等於n的最大奇數);當┌n/2┐為偶數時,剩下的數字為0,2,4…2*i(2*i為小於等於n的最大偶數)。
下面用數學歸納法證明該假設。
1).當n=3時,可能剩下的數字為0,2,假設成立;n=4時,剩下的數字為0,2,4,假設成立;n=5時,為1,3,5,假設成立。
2).假設當n=k時,假設成立。即1..k時,若┌k/2┐為奇,則為1,3,5…2*i+1;┌n/2┐為偶,則為0,2,4…2*i。則現在需證明n=k+1時,假設仍成立。
3).當n=k+1時,若此時┌k/2┐為奇時,則再分為兩種情況:k為奇數,或k為偶數。當k為奇數時,1^0^1…^1=1,再異或偶數k+1,1^0=1,則此時操作1…k+1剩下的數字仍然均為奇數,再根據結論1和結論2可知,剩下數字的個數應大於等於n=k,且最大奇數不能大於偶數k+1,則唯一的可能就是1..k+1剩下的數字與1..k剩下的數字相同,此情況符合假設。當k為偶數時,1^0^…^0=1,再異或奇數k+1,1^1=0,則此時操作1..k+1剩下的數字均為偶數,但結論1,2要求其個數應該大於等於n=k時的個數,且最大數不能大於k+1,則唯一的可能就是0,2…k,此情況仍符合假設。最後┌k/2┐為偶的情況,也可根據該奇偶性和結論1,2易證得該假設成立。故n=k+1時,假設仍然成立。
4).最後回到題目上來,令n=50,則根據結論可知,可能剩下的數字為1,3,5…49。
4、已知三個公升序整數陣列a[l], b[m]和c[n]。請在三個陣列中各找乙個元素,是的組成的三元組距離最小。三元組的距離定義是:假設a[i]、b[j]和c[k]是乙個三元組,那麼距離為:
distance = max(|a[ i ] – b[ j ]|, |a[ i ] – c[ k ]|, |b[ j ] – c[ k ]|)
請設計乙個求最小三元組距離的最優演算法,並分析時間複雜度。
解:這道題目有兩個關鍵點:
第乙個關鍵點:max =(|x1+y1-x2-y2|+|x1-y1-(x2-y2)|)/2 --公式(1)
我們假設x1=a[ i ],x2=b[ j ],
x3=c[ k ],則
distance = max(|x1 – x2|, |x1 – x3|, |x2 – x3|) = max( max(|x1 – x2|, |x1 – x3|) , |x2 – x3|) --公式(2)
根據公式(1),max(|x1 – x2|, |x1 – x3|) = 1/2 ( |2x1 – x2– x3| + |x2 – x3|),帶入公式(2),得到
distance= max( 1/2 ( |2x1 – x2– x3| + |x2 – x3|) , |x2 – x3| )
=1/2 * max( |2x1 – x2– x3| , |x2 – x3| )+ 1/2*|x2 – x3|//把相同部分1/2*|x2 – x3|分離出來
=1/2 * max( |2x1 – (x2 + x3)| , |x2 – x3| )+ 1/2*|x2 – x3|//把(x2 + x3)看成乙個整體,使用公式(1)
=1/2 * 1/2 *((|2x1 – 2x2| + |2x1 – 2x3|)+ 1/2*|x2 – x3|
=1/2 *|x1 – x2| + 1/2 * |x1 – x3| + 1/2*|x2 – x3|
=1/2 *(|x1 – x2| + |x1 – x3| + |x2 – x3|)//求出來了等價公式,完畢!
第二個關鍵點:如何找到(|x1 – x2| + |x1 – x3| + |x2 – x3|) 的最小值,x1,x2,x3,分別是三個陣列中的任意乙個數。
阿里巴巴2014筆試演算法題彙總
1.兩棵二叉樹t1和t2,t1的節點數是百萬量級,t2的節點數一千以內,請給出判斷t2是否t1子樹的可行演算法。分析 首先想到的是遞迴,但是t1的數量級太大,遞迴會導致棧溢位,於是以非遞迴實現。bool issubtree binarytreenode proot1,binarytreenode p...
阿里巴巴2014筆試演算法題彙總
1.兩棵二叉樹t1和t2,t1的節點數是百萬量級,t2的節點數一千以內,請給出判斷t2是否t1子樹的可行演算法。分析 首先想到的是遞迴,但是t1的數量級太大,遞迴會導致棧溢位,於是以非遞迴實現。bool issubtree binarytreenode proot1,binarytreenode p...
谷歌筆試最後一題
接上次的,google 2011校招清華筆試最後一題題目 感覺在考mapreduce思想和動態規劃 kof遊戲中乙個大招規則如下 s t,s與t分別為按鍵集合。當按鍵滿足一定規則時,可以連續按出大招,即連招。例如招數表如下 abc d,bcd e,de f,ef g。那麼,當按鍵順序為 abc d ...