1. 程式人生 > >2017年搜狐內推 面試題——談談面試中的演算法

2017年搜狐內推 面試題——談談面試中的演算法

在搜狐內推群,某同學接到面試電話,回憶了其中的幾道演算法題,有兩道受到了群友的熱烈討論,因此寫部落格來分享下思路。

第一題:給你一個數組,其中有一個元素的個數大於陣列總個數的一半,求出這個元素。

該同學的給出了方法一:先對陣列排序,然後找到中間的那個數字,一定就是我們要找的元素。如果使用快速排序的話,該演算法的平均時間複雜度為O(nlogn),空間複雜度為O(1)。

群友給的方法二:用HashMap 去解決,key存放元素,value存放個數,如果個數超過一般,輸出這個元素。該演算法時複雜度為O(n),空間複雜度為O(n)。

這裡有一種時間複雜度為O(n),空間複雜度為O(1)的演算法,主要思想如下:採用陣地攻守的思想:第一個數字作為第一個士兵,守陣地;count = 1;遇到相同元素,count++; 遇到不相同元素,即為敵人,同歸於盡,count--;當遇到count為0的情況,又以新的i值作為守陣地的士兵,繼續下去,到最後還留在陣地上的士兵,就是要找主元素。(ps:如果本題要求判斷超過一半的元素是否存在,只要在遍歷一次,記錄剩餘“士兵”的個數是否超過一半即可)。現在貼出java版演算法:

public class Solution{
    public int majority Element(int[] num){
 
        int major=num[0], count = 1;
        for(int i=1; i<num.length;i++){
            if(count==0){
                count++;
                major=num[i];
            }else if(major==num[i]){
                count++;
            }else count--;
            
        }
        return major;
    }
}

該演算法在《劍指offer》和leetcode中均有出現,所以有條件的話還是可以看看相關書籍,動手寫寫演算法的。

第二題:給你一個數組,一個目標值sum,在裡面尋找兩個數使其和為target。

這也是一道很經典的演算法題。

下面方法節選自《三十七章集錦by_July》。

方法一:直接窮舉,時間複雜度O(n^2),顯然是下下策。

方法二:對每個a[i],二分查詢sum-a[i]是否也在原始序列中,每一次要查詢的時間都要花費為O(logn),總的時間複雜度O(nlogn)。

方法三:有沒有更好的辦法呢?咱們可以依據上述思路2 的思想,a[i]在序列中,如果a[i]+a[k]=sum 的話,那麼sum-a[i](a[k])也必然在序列中,舉個例子,如下:原始序列:1、2、4、7、11、15 用輸入數字15 減一下各個數,得到對應的序列為:14、13、11、8、4、0第一個陣列以一指標i 從陣列最左端開始向右掃描,第二個陣列以一指標j 從陣列最右端開始向左掃描,如果下面出現了和上面一樣的數,即a[*i]=a[*j],就找出這倆個數來了。如上,i,j 最終在第一個,和第二個序列中找到了相同的數4 和11,所以符合條件的兩個數,即為4+11=15。

具體操作方法為:要達到O(N)的複雜度,第一個陣列以一指標i 從陣列最左端開始向右掃描,第二個陣列以一指標j 從陣列最右端開始向左掃描,首先初始i 指向元素1,j 指向元素0,誰指的元素小,誰先移動,由於1(i)>0(j),所以i 不動,j 向左移動。然後j 移動到元素4 發現大於元素1,故而停止移動j,開始移動i,直到i 指向4,這時,i 指向的元素與j 指向的元素相等,故而判斷4 是滿足條件的第一個數;然後同時移動i,j 再進行判斷,直到它們到達邊界。

該方法利用提高空間複雜度來減少時間複雜度,要是對時間複雜度要求高,對空間不是很嚴格的話,也是一種不錯的方法。

方法四:用hash表,給定a[i],根據對映查詢sum-a[i]是否在陣列中,時空都是O(n)。

方法五:如果陣列有序,就可以利用兩個指標i,j,各自指向陣列的首尾兩端,令 i=0,j=n-1,然後 i++,j--,逐次判斷 a[i]+a[j]?=sum,如果某一刻 a[i]+a[j]>sum,則要想辦法讓sum 的值減小,所以此刻i 不動,j--,如果某一刻a[i]+a[j]<sum,則要想辦法讓sum 的值增大,所以此刻i++,j 不動。所以,陣列無序的時候,時間複雜度最終為O(n*logn+n)=O(n*logn),若原陣列是有序的,則不需要事先的排序,直接O(n)搞定,且空間複雜度還是O(1),此思路是相對於上述所有思路的一種改進。

說到這個題目,我想額外提一下,方法二中涉及二分查詢,你會寫二分查詢嗎?知道mid=(low+high)/2潛在的風險嗎知道low<high條件可能會無法達到進入死迴圈嗎?如果你不瞭解上述的任何一個情況,建議去查閱相關的部落格。

從此次搜狐一面來看,主要是考察基礎的經典的演算法,所以學生在平時的學習重要注意夯實基礎。

相關推薦

2017 試題——談談面試演算法

在搜狐內推群,某同學接到面試電話,回憶了其中的幾道演算法題,有兩道受到了群友的熱烈討論,因此寫部落格來分享下思路。 第一題:給你一個數組,其中有一個元素的個數大於陣列總個數的一半,求出這個元素。 該同

阿里巴巴螞蟻金服2018屆校園招聘Java/c++試題2017

 螞蟻金服一面 ////////////////////////////////////////////////////////////////////////////    Java都學了些什麼?

2017網易網際網路試題(獎學金問題)

//來源:網易 //獎學金 //題目描述:小v今年有n門課,每門都有考試,為了拿到獎學金,小v必須讓自己的平均成績至少為avg。 // 每門課由平時成績和考試成績組成,滿分為r。現在他知道每門課的平時成績為ai , // 若想讓這

2018筆試程式設計題2

這個題我的想法是從大到小依次考慮 對於6*6的產品,每個產品需要一個包裹 對於5*5的產品,每個產品需要一個包裹,每個包裹剩下的空間最多可以裝下11個1*1的產品,根據包裹數量更新1*1產品的剩餘數

頭條補坑-更新

老樣子,答的好的這裡就不寫了。只記錄答的不好的的。 這次暴露出來的問題就是要多做專案,都實踐。 1.改這個程式碼 //目的碼 const obj = { name: " jsCoder", skill: ["es6", "react", "angular"], say: functio

Java試題面試遇到的問題總結

面試總結 jQuery中的$是什麼意思及 $. 和 $().的區別 $就是jQuery的別稱 而jQuery就是jQuery庫提供的一個函式.(好像也不僅僅只是函式, 因為還有 $.ajax(options) 這樣的使用,等同 jQuery.ajax(options))

這幾道Java集合框架試題面試幾乎必問

本文是“最最最常見Java面試題總結”系列第三週的文章。 主要內容: 1. Arraylist 與 LinkedList 異

2017網易網際網路試題-數字遊戲

原題如下: 小易邀請你玩一個數字遊戲,小易給你一系列的整數。你們倆使用這些整數玩遊戲。每次小易會任意說一個數字出來,然後你需要從這一系列數字中選取一部分出來讓它們的和等於小易所說的數字。 例如: 如果{2,1,2,7}是你有的一系列數,小易說的數字是11.你可

網易2017試題

有 n 個學生站成一排,每個學生有一個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?  輸入描述: 每個輸入包含 1 個測試用例。每個測試資料的第一行包含一個整

2017網易試題

題目:有n個奶牛排成一排,每個奶牛擁有一定的蘋果數ai,每次操作可以從任一隻奶牛手中僅且拿2個兩個蘋果給另外一隻奶牛,輸出至少要操作多少次才能使得所有奶牛的蘋果數相等,如果不可能達到相等狀態,則輸出-1. import java.util.*; public

2015暑假阿里面試經歷(止步於2)

感覺今年阿里內推開始得很早,年級群裡面很早就發出了很多阿里內推的訊息。這裡需要提醒一下各位,在內推的時候一定要看清楚自己將要內推的是什麼部門,因為阿里內推面試的時候都是分不同部門的,不同部門注重點不同。我投的是螞蟻金服的java開發崗。 一面(通過) 一面是在投出簡歷後幾天

2017網易校招試題

本人筆試的計算機視覺方向,程式設計題和其他研發崗位類似。 歡迎小夥伴們一起討論出正確答案。 共20個選擇題,3個程式設計題,1個簡答題 一.選擇題 1.Linux中,提供TCP/IP包過濾功能的軟體叫什麼? A.iptables B.r

2017網易試題---幸運的袋子

一個袋子裡面有n個球,每個球上面都有一個號碼(擁有相同號碼的球是無區別的)。如果一個袋子是幸運的當且僅當所有球的號碼的和大於所有球的號碼的積。 例如:如果袋子裡面的球的號碼是{1, 1, 2, 3},這個袋子就是幸運的,因為1 + 1 + 2 + 3 >

2017阿里巴巴經—測試開發崗

前言 傳說中的Alibaba 時間:2017/07 初 — 2017/07 末 渠道:官網內推,電話面試 崗位:測試開發崗 部門:螞蟻金服 測試開發在官網填寫簡歷是也會提供四個崗位選擇:雲端計算、大資料、智慧穿戴裝置,還有一個我忘了。。後來面試官跟我

2017阿里試題--演算法工程師(運籌優化)

2017阿里內推筆試題–演算法工程師(運籌優化) 題目 沐哲是一個菜鳥倉庫的一個揀貨員,但他有非常個怪異的習慣。每次揀貨的重量都要比之前揀的一個輕,每次揀到貨後都可以得到1塊錢,沐哲想知道這樣最多能賺多少錢 32 34 7 33 21 2 13 12

2017 年初、阿里、騰訊、百度、華為、京東、狗和滴滴試題彙集

前言:前一段時間和大家交流,據反饋現在Android崗位也沒有以前那麼多了,當然這不意味著飽和,只是市場更趨於合理一些,就像深圳房價一樣,以前破天慌的漲,新政出來後,房價慢慢趨向合理一樣。Android還有有很多機會的。最近結合一些面試的同學(包含社招和校招

阿裏前端試題

-s sts ner 刪除 adding i++ strong 適配 logs 利用面向對象思想完成買家信息刪除功能,每一條信息包含: 姓名(name) 性別(sex) 電話號碼(number) 省份(province) 實現以下要求: 不能借用任何第三方庫,需要使

java部類試題介面程式設計題

1、內部類的形式是怎樣的? ⒈靜態內部類 ⒉成員內部類 ⒊區域性內部類 ⒋匿名內部類 2、為什麼要有“內部類”? 1、內部類提供了更好的封裝。只能讓外部類直接訪問,不允許同一個包中的其他類直接訪問。 2、內部類可以直接訪問外部類的私有屬性,內部類被當成其外部類成員。但外部類不能訪問內

2018最常見的Python試題附帶答案

Q 1:Python有哪些特點和優點? 作為一門程式設計入門語言,Python主要有以下特點和優點: 可解釋 具有動態特性 面向物件 簡明簡單 開源 具有強大的社群支援 當然,實際上Python的優點遠不止如此,可以閱讀該文件,詳細瞭解: 戳這

1811月下,試題積累

map遍歷方法 1、Iterator遍歷 Iterator<Map.Entry<String,String>> it = map.entrySet().iterator(); while(it.hasNext()){ Map.En