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...