面試亂談談

今天博主這個小白去面試了一個大公司,這是博主第一次面試 這麼一個上市大公司 ,那給博主緊張的。
進去就被 保安大哥給攔住了,額…扯遠了,迴歸正題. 今天博主面試了這家大公司 面試題就兩道,兩道算法題,算是很簡單的算法題,可是博主太傻X了,用了最傻X的兩層for循環解決問題.導致時間複雜度變成了O(N^2)
還好本博主機制後來想到了補救之道 ,話不多說,放上面試題(PS 對面試題進行了改造,因爲該公司招聘還在進行中,但是 貌似沒什麼必要 反正博主的博客也沒人看 2333):
面試題一考點連續最長子序列
這道題最好的辦法應該:是動態規劃或者是貪心,可是博主當時太緊張了,就用了最2B 的 兩層for循環,被自己的2B打敗了,不知道面試還能不能過了呢
問題描述:給出一個序列a1,a2,a3,a4,a5,a6,a7….an,求它的一個子序列(設爲s1,s2,…sn),使得這個子序列滿足這樣的性質,s1

int LIS(int arr[], int n)  
{  
    for(int i=1; i<=n; ++i)  
        dp[i] = 0;  
    int ans;  
    dp[1] = 1;  
    for(int i=2; i<=n; ++i)  
    {  
        ans = dp[i];  
        for(int j=1; j<i; ++j)  
        {  
            if(arr[i]>arr[j] && dp[j]>ans)  
                ans = dp[j];  
        }  
        dp[i] = ans+1;  
    }  
    ans = 0;  
    for(int i=1; i<=n; ++i)  
    {  
        if(dp[i] > ans)  
            ans = dp[i];  
    }  
    return ans;  
}

時間複雜度:(NlogN):
除了算法一的定義之外(p【i】相當於算法一中的arr【i】),增加一個數組b,b[i]用以表示長度爲i最長子序列的最後一個數最小可以是多少。易證:i

int bSearch(int num, int k)    
{    
    int low=1, high=k;    
    while(low<=high)    
    {    
        int mid=(low+high)/2;    
        if(num>=b[mid])    
            low=mid+1;    
        else     
            high=mid-1;    
    }    
    return low;    
}    

int LIS()  
{  
    int low = 1, high = n;  
    int k = 1;  
    b[1] = p[1];  
    for(int i=2; i<=n; ++i)  
    {  
        if(p[i]>=b[k])  
            b[++k] = p[i];  
        else  
        {  
            int pos = bSearch(p[i], k);  
            b[pos] = p[i];  
        }  
    }  
    return k;  
}  

面試題二 : 類似於查找插入,判斷一個數應該在一個數組裏的下標 結題步驟跟第一個面試題相似 就不一一列舉 了

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