題目來源於《程序員面試筆試寶典》、各大博客以及歷年真題,供大家查漏補缺。(持續更新中)
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);
二分查找,必須熟練掌握的基礎算法,有很多相關變形,常被用於提升算法效率。
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個數出現奇數次,其餘數均出現偶數次,求這兩個數。
奇偶數問題一般可通過位運算解決。本體可通過兩次總體的異或操作得到最終結果。