[爬坑日記]2014.1.9某互聯網創業公司,教育相關,詞典幫

昨天上午剛改好簡歷,bb還沒回我修改意見就直接發了,沒想到當天下午就接到了面試通知,說明天就要面。早晨有考試,還有另一門結課,於是定在了15:00


13:50出發,14:40到達三里屯soho

前臺美女挺漂亮,妝略濃,微俗。裝修很好,白色風格,顯得乾淨。

之前簡單查了下小夥的資料,本科吉大計算機,研究生北大信科,11年屆,宣傳海報上有圖。


14:50,一面

嘮家常,扯簡歷,blabla一大堆,這時我還蠻有激情的,狀態很不錯,對自己比較滿意。

問了些基礎的,什麼TCP握手啊,亂七八糟的。

開始做題,

第一道,歸併排序,遞歸非遞歸。沒什麼意思

第二道,二叉搜索樹變有序雙向鏈表,直接用遞歸寫就好,只是好久沒用鏈表指針什麼的,有點生疏,而且困勁上來了,畢竟今早晨不到7點就起了啊!最後看着自己寫的代碼都迷糊,勉強過關。

小夥說挺好,沒啥事,我去給你找二面。


趴桌子上眯了一會,更困了……


15:50左右,二面

一個比小夥歲數大點的小夥,略傲,不嬌,不過顯然要比小夥有氣場多了,沒家常,直接扯簡歷,可之前扯的已經很多很詳細了,我是有點累了,也沒剛纔有激情了,隨便說了說就結束了。開始做題。

只有一道,有重複元素的一個有序數組,統計value出現的次數。

實在是太累了,做了好久,結果頁不是很滿意,傲不嬌還給我又倒了杯水,最後給的算法思路是對的。其實很簡單的一道題,就二分查找嘛。代碼稍後補上,見附[1]

期間傲不嬌還說了一下(start+end)/2的溢出問題,我改成了(a/2+b/2+(a%2&&b%2)),傲不嬌說要更直觀一點。

不知道啥叫“直觀”,他也沒繼續糾結,就說回去查查,附[2]平均數的溢出問題。

傲不嬌已經玩了半天手機了,總結是“你有解決問題的能力,不過怎麼這麼繞呢”。

我也沒好意思說又困又累。

他出門前指了下廁所,然後找三面了,我也懶得去。


趕緊站起來,伸懶腰,拉筋,做活動,好不容易精神起來了。


16:35?忘了,三面

一位大哥,氣場更穩重了,進門就一句話“繼續寫代碼”,我還在那拉筋呢,忙站起來說好。

第一道,輸入一個由數字組成的字符串,要求輸出的字符串中不包含5和連續的10

我還以爲是算法題,想了想什麼調換位置啊,什麼亂七八糟的,也是有點蒙。

大哥說不是算法題,就是寫代碼的題,還直接說讓我考慮150,我才明白過來是“輸出字符串中不包含”

然後落筆開始寫,先打給個草稿,然後整理了一下。

整體比較簡單,只是細節問題,最後他看的時候我又補了幾個小毛病,他在那寫測試樣例的時候我又發現了個小bug,11550000,後面的0比前面的1多時的情況,然後又加了兩行代碼。只不過當首部需要刪除的時候有個退化,O(n)的問題編程了O(n^2),問題不大。最後見附[3]

第二道,不用寫代碼,直接說算法。

大哥一直很嚴肅,這題題說的很萌:一個環,還上一些節點,奧特曼打小怪獸,有的屋子是一堆怪獸,有的屋子是一堆麪包,打怪獸掉血,吃麪包長血。假設奧特曼走完一圈一定能活下來,問從哪走能活。如圖所示,其實挺簡單,隨機選一個作爲起點,一個一個往後加,如果加和成負值了,往前提起點,直到加和爲正時再往後走,挺簡單的,就不說了。wKioL1LOmTih2QMOAAGG4OqvvD4073.jpg

第三道,說的也很萌,估計這大哥以前是搞ACM出身,A到B地的公路里程牌,一面是A到B剩餘的公里數,另一面是B到A的,但風很大,說不定就把牌子給吹轉向了,給一組序列,判斷是否是一組合法的牌子序列。

這題有點意思,給出的答案應該問題不大,還需要整理,不過估計他當時也累了,我倆都懶得細想了。答案見附[4]。



最後一般都是這個:“有沒有什麼問題了。”我客套了一下,然後問“您覺得在大公司和創業公司工作有什麼區別,有哪些優劣。”他說我不是在“海魚”那幹過麼,我說我想聽聽您的意見,他還說他聽說“海魚”那好像不太行了。

關鍵要看你所在的團隊,離你最近的這些人的水平,所以去大公司重要的是看mentor

1.大公司升職慢,一個蘿蔔一個坑

2.大公司時間多,成長慢,不過可以自己做code review,慢慢雕琢

3.大公司穩定,還炫了一下他們已經融到B輪了


17:45,再見。


倒是沒什麼新穎的,倒是跟我爸說的個別觀點有點像。



總之,題保持穩定的刷,科研實習總要有一種。等消息,機會對半開吧。


附[1]

#include<stdio.h>
#include<stdlib.h>
int binary_search(int a[], int n, int value, int direct) //left is 0, right is 1
{
    int start = 0, end = n - 1, mid;
    while (start <= end)
    {
        mid = (start & end) + ((start ^ end) >> 1);
        if (a[mid] < value || (a[mid] == value && direct == 1))
        {
            start = mid + 1;
        }
        else if (a[mid] > value || (a[mid] == value && direct == 0))
        {
            end = mid - 1;
        }
    }
    return mid;
}
int main()
{
    int a[12] = { 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4 };
    int value = 3;
    int left = binary_search(a, 12, value, 0);
    int right = binary_search(a, 12, value, 1);
    left += (left != value);        //這裏要注意一下,有可能直接把value劃外面去了,就是可能得到的位置是2的最後一個
    right -= (right != value);
    printf("%d\n", right - left + 1);
    system("pause");
}


附[2]

double avg_positive(int a[], int n)
{
    int i;
    double result = 0;
    for (i = 0; i < n; i++)
    {
        result += (a[i] - result) / (i + 1);
    }
    return result;
}

這裏直接默認數組a是遞增的了,否則括號要價格絕對值,可以解決正數的平均數,有正有負的話還是會溢出。


多個數的時候可以這樣做

double avg_positive(int a[], int n)
{
    int i;
    double result = 0;
    for (i = 0; i < n; i++)
    {
        result += (a[i] - result) / (i + 1);
    }
    return result;
}


當只有兩個數的時候,除了上面提到過的,還可以用位操作的方式,前提是同號,顯得更高端一些

int avg_two1(int a, int b)
{
    return (a&b) + ((a^b) >> 1);
}

證明如下

對於c=(a+b)/2,按位表示爲a[n]a[n-1]……a[0]和b[n]b[n-1]……b[0],可以證明c[i]=((a[i+1]+b[i+1])的低位)+((a[i]+b[i])的高位)

(a[i+1]+b[i+1])的低位 = a ^ b

((a[i]+b[i])的高位) = a & b

所以 c = (a ^ b >> 1) + (a & b)

寫一下就都清楚了,面試時可以寫出來嘗試着虐虐面試官。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章