日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

四道微软面试经典算法题

發布時間:2024/9/20 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 四道微软面试经典算法题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
比較經典的四個算法題,目前只收集到相關的思路和個別題目的解法,不斷更新中
1.一個整數數列,元素取值可能是0~65535中的任意一個數,相同數值不會重復出現。0是例外,可以反復出現。
請設計一個算法,當你從該數列中隨意選取5個數值,判斷這5個數值是否連續相鄰。
注意:
- 5個數值允許是亂序的。比如: 8 7 5 0 6
- 0可以通配任意數值。比如:8 7 5 0 6 中的0可以通配成9或者4
- 0可以多次出現。
- 復雜度如果是O(n2)則不得分。
2.設計一個算法,找出二叉樹上任意兩個結點的最近共同父結點。
復雜度如果是O(n2)則不得分。
3.一棵排序二叉樹,令 f=(最大值+最小值)/2,設計一個算法,找出距離f值最近、大于f值的結點。
復雜度如果是O(n2)則不得分。
4.一個整數數列,元素取值可能是1~N(N是一個較大的正整數)中的任意一個數,相同數值不會重復出現。設計一個算法,找出數列中符合條件的數對的個數,滿足數對中兩數的和等于N+1。
復雜度最好是O(n),如果是O(n2)則不得分。
思路分析
1.非0最大-非0最小+1 <=5 ==> 非0最大-非0最小 <=4
2.如果每個節點包含父親指針,把兩個節點到根的路徑都記錄下來,兩條路徑的最后面的元素肯定相同,
從兩條路徑的最后一個元素向前比較,直到第一次出現分叉為止,就可以找到最近節點。復雜度為O(n),
路徑最長可能是n
如果不包含父親節點,那就先前序遍歷二叉樹,遍歷的時候可以像哈夫曼樹那樣左右01編號,
記錄給定兩節點的到達路徑,最后比較兩個0,1序列的前面位數,直到出現不相等為止,就找到最近父節點,
復雜度也是O(n)
3.找出最大值,最小值,復雜度都是O(h),然后搜索f,可以找到f應該插入的位置,復雜度也是O(h),
再找f的后繼,復雜度也是O(h),h最大可能是n,所以總體最壞情況復雜度就是O(n)
4.先排序,復雜度O(nlgn),然后用兩個指示器(front和back)分別指向第一個和最后一個元素,如果
A[front]+A[back]>N+1,則back–;
如果A[front]+A[back]=N+1,則計數器加1,back–,同時front++;
如果A[front]+A[back] 重復上述步驟,O(n)時間找到所有數對,總體復雜度為O(nlgn)
題目分析
第1題:首先掃描一遍求出非0平均值,然后再掃描一遍即可判斷,復雜度:O(n)
第2題,是一個送分題,可以設計一個相當巧妙的數據結構,其復雜度為O(n)
第3題,也是送分題,掃描幾次即可
第4題,送分題。犧牲空間即可完成。
具體算法
1.思路是 非0最大值-非0最小值 <=數組長度-1
我覺得這道題的前提非常重要
1public boolean isContiguous(int[] array)
2?? {
3?? int min=-1;
4?? int max=-1;
5?? for(int i=0;i <array.length;i++)
6?? {
7?? if(array[i]!=0)
8?? {
9?? if(min==-1||min>array[i])
10?? {
11?? min=array[i];
12?? }
13?? if(max==-1||max <array[i])
14?? {
15?? max=array[i];
16 }
17?? }
18?? }
19?? return max-min <=array.length-1;
20?? }
4.關鍵點在于創建一個Hash表,典型的以空間換時間:-)
1??? public static int getSumCount(int[] array,int N)
2???? {
3???? int count=0;
4???? //創建哈希表
5???????? int[] hashTable=new int[N+1];
6???????? for(int i=0;i <array.length;i++)
7???????? {
8???????? hashTable[array[i]]=array[i];
9???????? }
10???????? for(int i=0;i <array.length;i++)
11???????? {
12???????? //如果是數對中較小的整數(防止重復計數)
13???????? //并且配對的整數存在
14???????????????? //并且不等于與之配對的整數,因數列不存在重復整數
15???????????????? if(array[i] <=(N+1)/2&&hashTable[N+1-array[i]]!=0&&array[i]*2!=N+1)
16???????? {
17???????????? count++;
18???????? }
19???????? }
20???? return count;
21???? } 來自: http://hi.baidu.com/fengfage/blog/item/c9da90ca137fd24af21fe78f.html

總結

以上是生活随笔為你收集整理的四道微软面试经典算法题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。