面試官是個部門經理,比較和藹,說話愛笑,比別的公司的總監層面的人嚴肅的面孔好多了,也讓面試者輕鬆很多。總結下他問的諸多問題以及我的解法,先上幾個
問題 1
有數字1、2、3….直到n+2的遞增數列,每個數都是唯一不重複的,以1的步長增長的。去掉其中兩個數,然後打亂次序,找出被去掉的數到底是哪兩個?(n假設是10w,空間複雜度要求o(1))
答:方法1:
這是我的回答
設這些數儲存在陣列a中,用乙個10w+2大小的陣列b標誌某乙個數是否出現,預設全部置0.順序掃瞄a陣列,對a中的每乙個數i,去設定b[i]=1,則相對的沒出現的數則b[i]=0;掃瞄完a後,再掃瞄陣列b,發現b[i]=0的則為缺失的數。
時間複雜度:o(n+n+2)=o(n)
空間複雜度:o(n+2)=o(n)
這個方法是最容易想到的,但是要o(n)的空間,也就是10w+2這麼大個陣列,達不到題目o(1)的要求。面試官肯定不會是考你這個方法,必須得有別的方法。
方法2:
還想到的另外乙個方法,用氣泡排序,但是時間複雜度太高,當時不確定別的排序的空間複雜度,就沒敢說
對原陣列a進行一次排序,然後從頭到尾挨個掃瞄,發現相鄰兩個數的差不是1的時候,就可以確定這兩個數之間少了乙個數了。
回去查了下,氣泡排序、直接插入排序、選擇排序、堆排序的空間複雜度都是o(1)。但是時間複雜度上,只有堆排序是o(n*logn)的複雜度,別的都是o(n^2)的,太高,面試官也不滿意。而快速排序需要空間複雜度是o(n*logn),也被排除了。
看來這種方式最好的時間複雜度,也只是用堆排序
時間複雜度:o(n*logn)+o(n)=o(n*logn)
空間複雜度:o(1)
別忘了還有個建立堆的過程,也很複雜。所以這個方法也被排除了。
方法3:
回到家苦思冥想,才想到,還有bitmap這個方法,面試的時候一著急竟然忘記了,看來應急能力不行啊,有待提高
bitmap這種方式講起來要有一大篇幅,大家可以自己去網上搜下這種結構。我這裡就是簡單的說下,乙個位元組有8個bit位,假如存在1,我們就讓第乙個bit位置1,不存在就置0;同理存在2,就把第二個bit位置0,3就第三個位元位。當掃瞄一次陣列a之後,則會把n個位置的bit位都置為1,那麼不存在的兩個數,所對應的座標位元位就是0,然後掃瞄所有的位元位,發現不是0的位置,就是我們要找的數。當然,10w個數,需要10w/8=1.25w個位元組的記憶體空間,實際上空間依然是o(n/8)=o(n),只是常係數小一些.而且操作bit位可不像運算元組一樣直接定位,而是通過位移的方式來操作的,這樣時間開銷更大。
時間複雜度:o(n)
空間複雜度:o(n)
這個方式也不行。
方法4:
這個方法是後來在網上找的。我面試的時候,只想到了可以算出來兩個去掉的數的和,這便成了乙個方程式,但是如何把這個和分解成兩個數,我卻百思不得其解。後來看到網上的辦法,才想到,我只想了一半,另一半可以用平方和來再確定乙個方程式,兩個二元方程式是可以算出解的。看起來可以滿足要求
設去掉的兩個數為x和y,則我們累加1到10w+2,這個可以用數學公式推導得到乙個和sum1;然後掃瞄陣列,從第一位一直累加到最後一位,總共10w個數累加,得到sum2,那麼x+y的值s1=sum1-sum2:
x+y = s1
同理,我們可以得到1到10w+2的平方和 減去 陣列a中每個數的平方和,從而得到x^2 + y^2的值:
x^2 + y^2 = s2
根據兩個方程可以解出x和y。
這裡需要注意的是,計算平方和的時候有可能會越界,可以使用unsigned long long,或者一邊加(1到[10w+2]的平方和)一邊減(陣列a中每個數)。
時間複雜度:o(n)
空間複雜度:o(1)
建立於 2017-05-19 北京,修改於 2017-05-20 北京
GIT 學習聖經
1.1 關於版本控制 1.2 git 簡史 1.3 git 基礎 1.4 命令列 1.5 安裝 git 1.6 初次執行 git 前的配置 1.7 獲取幫助 1.8 總結 2.1 獲取 git 倉庫 2.2 記錄每次更新到倉庫 2.3 檢視提交歷史 2.4 撤消操作 2.5 遠端倉庫的使用 2.6 ...
讀《單車聖經》
國內人寫的。合寫 檔案位置 f soft gearvr 比賽本本備份 20160518 第 1 章,了解自行車 高輪車有名,就是太不穩了。20頁 起源於歐洲 31頁 自行車分類 32頁自行車選購指南。比網上的 漂亮多了,哈 第2部分 自行車認知 39頁 第3 章 支撐系統 56頁 車架剛性 強度鋼材...
Windows程式設計「聖經」
windows程式設計 聖經 十年依舊暢銷不衰的神品 傳奇大師帶你走入windows程式設計聖殿 windows程式設計最舉足輕重的書當然就是charles petzold的programming windows。你還沒有讀過嗎?暈,趕快去買一本!windows tech journal 本書讓你如...