程序員筆試面試算法題系列--數組

題目來源於《程序員面試筆試寶典》、各大博客以及歷年真題,供大家查漏補缺。(持續更新中)

1 遞歸實現數組求和

void Sum(int a[],int n,double& sum)
每次遞歸,在sum上累加,同時n自減,當n<0,退出遞歸。

2 利用一個for循環打印二維與三維數組 

double total=row*col;
for(int k=0;k<total;k++)
{
   printf("%d  ",a[k/col][k%col]);
}
三維類似,a[k/yz][k/z%y][k%z]


3 遞歸判斷數組是否遞增

return a[i]<a[i+1]&&isIncrease(a,i+1);


4 分別使用遞歸與非遞歸實現二分查找

二分查找,必須熟練掌握的基礎算法,有很多相關變形,常被用於提升算法效率。

5 在排序數組中確定給定數字出現的次數

利用二分查找確定給定數字的左右邊界即可。

6 計算兩個有序數組交集

比較大小,選取較小者,合併

7 找出數組中重複次數最多的數

map<int,int> m_count;
int val=0;
for(int i=0;i<n;i++)
{
    if(++m_count[a[i]]>m_count[val])
         val=a[i];
}
8 找出數組中出現次數超過一半的數

有兩種常用解法:1) 用一變量存儲當前數的重複次數,當與數組下一個數相同時,重複次數加1,否則減1,當重複次數爲0時,替換當前數。

double sum=0;
for(int i=0;i<n;i++)
{
    if(i==0||a[i]==currentNum)
       {currentNum=a[i];sum++;}
    else if(sum>0)
       sum--;
    else
       {currentNum=a[i];sum=1;}
}
2) 另一種解法威力更大,即利用快速排序中的分區算法partition,這一算法能夠在nlogn時間複雜度內尋找前k個數,在本題中,k=n/2。

9 判斷數組中數值是否連續(0可替代任意數)

數組排序,計算最大值與最小值差是否在一定範圍內。

10 N個元素,2個數出現奇數次,其餘數均出現偶數次,求這兩個數。

奇偶數問題一般可通過位運算解決。本體可通過兩次總體的異或操作得到最終結果。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章