今天參加了樂視的校招筆試題有一道以前很熟悉的一道題記錄一下
備註:今天樂視筆試好多圖的選擇題和執行緒間同步的方式一道選擇題(上次總結過)
給定乙個無序的整數陣列,怎麼找到第乙個大於
0,並且不在此陣列的整數。比如
[1,2,0]返回3
,[3,4,-1,1]返回2
,[1, 5, 3, 4, 2]返回6
,[100, 3, 2, 1, 6,8, 5]返回4
。要求使用
o(1)
空間和o(n)
時間。
這道題目初看沒有太好的思路,但是借鑑下《
白話經典演算法系列之十 一道有趣的google面試題
》這篇文章,我們不發現使用「基數排序」正好可以用來解決這道題目。
以為例來簡介這種解法:
從第乙個數字開始,由於a[0]=1,所以不用處理了。
第二個數字為3,因此放到第3個位置(下標為2),交換a[1]和a[2],得到陣列為。由於6無法放入陣列,所以直接跳過。
第三個數字是3,不用處理。
第四個數字是-100,也無法放入陣列,直接跳過。
第五個數字是2,因此放到第2個位置(下標為1),交換a[4]和a[1],得到陣列為,由於6無法放入陣列,所以直接跳過。
此時「基數排序」就完成了,然後再從遍歷陣列,如果對於某個位置上沒該數,就說明陣列缺失了該數字。如缺失的就為4。
這樣,通過第i個位置上就放i的「基數排序」就順利的搞定此題了。
**也非常好寫,不過在交換兩數時要注意判斷下兩個數字是否相等,不然對於像這樣的資料會出現死迴圈。
完整的**如下:
[cpp]view plain
copy
//【白話經典演算法系列之十六】「基數排序」之陣列中缺失的數字
//bymorewindows(
//歡迎關注
#include
void
swap(
int&a,
int&b)
intfindfirstnumbernotexistenceinarray(
inta,
intn)
void
printfarray(
inta,
intn)
intmain() ;
//inta[maxn]=;
inta[maxn]=;
//inta[maxn]=;
printfarray(a,maxn);
printf("該陣列缺失的數字為%d\n"
,findfirstnumbernotexistenceinarray(a,maxn));
return0;
}
美團上機筆試題:演算法
1給你1元5元10元50元100元面值的紙幣,組成n元的所有組合方式個數
2無序陣列隨機去取兩個,求兩個數之和不超過limit的最大值是
美團筆試演算法題 統計位數
題目 統計位數 輸出 樣例輸入 2 13417 4解題思路 沒有思路時,歸納 f n f n 表示n的統計位數 規律基本出來了,f n n 10k 1 1 k f 10k 1 1 f n n 10k 1 1 k f 10k 1 1 if10k 110k that is k floor log10n ...
樂視筆試題
1 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個正數組成子陣列,每個子陣列都有乙個和。求所有子陣列的最大值。時間複雜度o n 例如 輸入1,2,3,10,4,7,2,5 和最大的子陣列為3,10,4,7,2 因此輸出為該子陣列的和18 public class maxsubsum ...
美團網2014筆試演算法題彙總
1.鍊錶翻轉。給出乙個鍊錶和乙個數k,比如鍊錶1 2 3 4 5 6,k 2,則翻轉後2 1 4 3 6 5,若k 3,翻轉後3 2 1 6 5 4,若k 4,翻轉後4 3 2 1 5 6,用程式實現。include using namespace std struct listnode listn...