一道筆試題討論

2021-06-21 16:23:08 字數 1199 閱讀 9925

題的大意是這樣的:

有兩等長陣列a,b,所含元素相同,但順序不同,只能取得a陣列某值和b陣列某值進行比較,比較結果為大於,小於,等於,但是不能取得同一陣列a或者b中兩個數進行比較,也不能取得某陣列中的某個值,找到乙個好的演算法實現正確 匹配,(即a陣列中某值與b中某值等值),分析演算法時間複雜度,寫出演算法思路即可。

回答1:

先取a0,與b0~bn-1比較,比較結果計入乙個結構陣列c,結構為:。其中「標記」可為:大於,小於,等於。「某數在a/b中的位置」:0~n-1,為相應位置。注:第一次比較後,c中元素都為{某數在b中的位置,標記,a0}格式。

取a1,由c可知b中與a0大小相同的數,與其比較。若a2大,則與b中比a0大的值比較。將比較結果替換計入結構陣列c。若a2小亦同理。

執行至完畢。

沒好好學過資料結構,不知道複雜度是多少,哪位來指點一下。

回答2:

樓上這位朋友的思路還可以,不過你所說的「若a2大,則與b中比a0大的值比較」應該是 a1 吧,但是若你在比較a0 時候把結果順序儲存在結構陣列裡面的話,那麼其實你在用「 a1」 和「b中比a0大的值比較」時,還是掃瞄了一遍這個結構陣列,複雜度還是沒能減少,

不過根據你的思路,我想到乙個方法,我們可以討論下,其他朋友也可以指點下。

1)在a陣列中隨機選取乙個數,(根據題意,我們並不知道這個值的確定值是多少)比如說 a[i] ,然後和b 陣列中進行比較,根據你的資料結構,將b陣列每個數與a[i]進行比較,若比 a[i] 大的按照從後向前儲存,比 a[i] 小的從前向後儲存,要是等於a[i] ,就記錄下來 這個值在b的位置 j,繼續比較,直到b中陣列全部比較完成,然後再把這個相等的b[j] 插入空餘的那個中間位置上。

2) 然後再從a 陣列中取出數a[k]與b[j](這個b[j] 就是a [i],因為同一陣列中不能比較大小,只能採用這種方式)比較,若比b[j]大,那麼從結構c中 a[i] 後面的比較,若比b[j]小,就從結構c中 a[i] 前面的比較,直到找到相等,然後更新結構陣列c 中與這個相等相應值。(注意,在這裡,只更新相等的那個數值的 "標記","某數在a中的位置",其它與a[k]不相同,或大,或小的情況下,不更新,即還保持a[i] 的比較結果,以利於繼續比較)

3)重複步驟 2,繼續取a陣列 剩下的值,仍然與那個 b[j]比較,這樣逐步更新結構陣列c ,直到a陣列全部取出比較完,那麼這個程式也就完成了相應的功能。

其實這裡用到了 快速排序的某些思想。只是這個隨機選擇a[i],要是選擇好,可以大大降低比較次數。

一道筆試題

看到一道筆試題,跟自己想的有點出入,就跑了下,看了看原因。我稍微改了下 include int main int argc,char argv 輸出結果 c 5 d 245 press any key to continue vc6.0 debug下的彙編 5 unsigned char a 0xa...

一道筆試題

上次去筆試的時候,有一道題,怎麼也沒做出來,當時也是很緊張,有些思路,但卻沒有做出來。有四個人要過乙個獨木橋,因為天比較黑,而且橋只能允許兩個人同時通過,並且他們只有乙個手電筒。四個人單獨同時橋的時間是1,2,5,8分鐘。問最短的時間是多少?當時我的答案 1和8,1回來,1 5,1回來,1 2 8 ...

一道筆試題

題目是這樣的 判斷乙個小於1000的正整數是否為素數。素數的定義就不說了,以下直接分析解法,畢竟是在寫與專業相關的東西,是給本專業的人看得,所以看的人應該有點基礎吧?求素數的問題是乙個數學上的難題,這是常識,但是本題目限制了最大範圍是在1000以內,所以就可以嘗試找出乙個足夠好的解了。首先給出乙個最...