高效面試之陣列專題初級篇

2021-06-26 13:55:11 字數 4332 閱讀 4582

1.如何用遞迴實現陣列求和?

int getsum(int *a,int n)

2.如何用乙個for迴圈列印出乙個二維陣列?

for(int i=0;iprintf("%d ",array[i/n][i%n]);

3.在順序表插入和刪除乙個節點平均移動多少個節點?

插入:平均n/2

刪除:平均(n-1)/2

4.如何用遞迴的演算法判斷乙個陣列是否是遞增?

bool isincrease(int a,int n)

5.如何分別使用遞迴與非遞迴方式實現二分查詢?

int binarysearch(

int array,int start,int end,int finddata)

else if(array[mid]>finddata)

else

return binarysearch(array,mid+1,end,finddata);

}//迭代

int binarysearch(

int array,int len,int finddata)

} 6.如何在排序陣列中,找出給定數字出現的次數

例如[1,2,2,2,2,3] 2出現3次。

兩次二分查詢可以在o(2*logn)時間複雜度搞定

第一次二分查詢找到最左邊的值lower,第二次查詢找到最右邊的值upper,然後count=upper-lower

//迭代

int binarysearch(

int array,int len,int finddata,

bool isleft)

else if

end=mid-1;

else

start=mid+1; }

return last>0?last:-1; }

7.如何計算兩個有序陣列的交集?

a=0,1,2,3,4

b=1,3,5,7,9

int mixed(int array1,int n1,int array2,int n2,int *mixed)

else if(array1[i]>array2[j])

else if(array1[i]

return k;}

8.如何讓找出陣列中重複次數最多的數?

c:int count[max]來記錄每個元素出現的次數,其中max為陣列的最大值

c++:使用map表

#include

using namespace std;

bool findmostfrequentarray(int *a,int size,int &val)

return true;

}9.如何在o(n)的時間複雜度內找出陣列中出現次數超過一半的數?

2,1,1,2,3,1,1,3

方法一,縮小規模:如果每次刪除兩個不同放入數(不管包括不包括最高頻率詞),在剩餘的數字中,最高頻詞一樣超過50%,最後剩餘的一定是高頻詞

int find(int array,int len)

else

}return candidate;  }

10.如何找出陣列中唯一的重複元素?

條件限制:陣列a[n],數字範圍在[1,n-1]

方法:所有陣列中的數求和-1到n之和

方法2:異或

重複數為a,剩餘n-2個數異或結果為b,那麼n個數的異或結果為a^a^b.

1到n-1的數異或結果為a^b

那麼(a^a^b)^(a^b)=a

方法三:位圖法

voidsetbit(intn)  

inttestbit(intn)  

intfind(intarray,intlen)  

return error;}

11.如何判斷乙個陣列中的數值是否連續相鄰?

1)5個數執行亂序,如8 7 5 0 6

2)0可以匹配多個任意數,0可以多次出現。

12.如何找出陣列中出現奇數次的元素?

只有乙個元素奇數次,找出來

異或引申:n-2個元素出現了偶數次,

兩個出現了奇數次,如何讓在o(1)空間複雜度,找出這兩個數?

1)設2個數為a,b,

x=a^b

2)如何求a?

x中第k位為1,則a,b的第k位必然不相同,把所有第k位為1的數全部異或,即為a.故

for(.....)

if((a[i]>>k) &1)

s=s^a[i];

s即為a.

3)如何求b?

x^a=(a^b)^a=b

void find(int a,int length)

int s1=s;

int s2=s;

while(!(s1&1))

for(i=0;i

printf("%d %d\n",s,s^s2);

}13.如何找出數列中符合條件的數的個數?

給定sum=10,求出兩個數

方法:先排序,然後查詢

for(i=0,j=n-1;i=0 &&i

else if(array1[i]+array2[j]

else 

}14.如何尋找出數列中缺失的數?

15.如何判斷陣列是否存在重複元素?

一:排序,相鄰比較

o(nlogn) o(1)

二:bitmap

o(n) o(n)

三:遍歷陣列,檢索第i個位置的數字為j,則通過交換將j換到下標j的位置山。直到所有數字都出現在自己對應的下標處,或發生了衝突

o(n) o(1)

int repeat(int *a,int n)

return 0;

}16.如何重新排列陣列,使得陣列左邊為奇數,右邊為偶數?

分析:類似於快速排序,用兩個指標分別指向陣列的頭和尾,頭正向遍歷陣列,找到第乙個偶數,尾指標逆向遍歷陣列,找到第乙個奇數,好、交換兩個指標指向的數字。重複上訴步驟,直到頭指標大於等於尾指標為止。

void reversearray(int arr,int len)

} 17.如何把乙個整形陣列中重複的數字出掉?

快排序,然後刪除?

18.如何找出乙個陣列中第二大的數?

通過2個變數,max.sec_max

19.如何尋找陣列中的最大值和最小值?

方法一:取兩個變數,min和max。迴圈一次每次取出乙個和min和max比較。需要

2*n次比較。

方法二:按順序將相鄰的兩個數分在一組。相鄰一組元素比較,大的放在偶數字,小的放在奇數字。

56 83 79

65  83 

97然後從偶數字找出最大數

0.5n次,奇數字找出最小數

0.5n次 ,共比較1.5*n次

方法三:分治法

將陣列分為兩半,分別找出兩邊最小值,最大值,則最小值、最大值分別是兩邊最小值的較小者,兩邊最大值的較大者。

1.5n次

void getmaxmin(int a,int low,int high,int &max,int &min)

else}

19.如何將陣列的後面m個移移動為前面m個數

1,2,3,4,5|6,7,8,9,10

void reverse(int arr,int start,int end)

}void f(int a,int len,int k)

21.如何計算出序列的前n項資料?

正整數序列q中的每個元素都至少可以能被正整數a和b中的乙個整除。現在給定a和b,如何求出q中的前幾項?

當a=3,b=5時,n=6時,序列為3,5,6,9,10,12

陣列a存放:3*1,3*2,3*3,。。。

陣列b存放:5*1,5*2,5*3,。。。

i,j指標分別指向a,b的第一元素,取min(a[i],b[j]).

前端面試總結篇(初級)

除了這兩個,關於es6的常用還有箭頭函式 模板字串 變數的解構賦值等 所謂的跨域問題是由於瀏覽器的同源策略限制的,當協議網域名稱埠號不同即為跨域,對於協議和埠來說,前端不能解決。解決跨域的幾種方式 1 資訊,伺服器收到請求,需要請求者繼續執行操作 101,公升級為websocket協議 2 成功,操...

初級演算法探索 陣列篇(一)

問題 從排序陣列中刪除重複項 給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。示例 1 給定陣列 nums 1,1,2 函式應該返回新的長度 2,並且原陣列 nu...

初級演算法探索 陣列篇(九)

問題 兩數之和 給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 理解同一元素不能重複使用 3,3 ta...