• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Fly me to the moon

            the beauty of C++

            筆面試題目記錄(一)

            找工作的第一場仗打得非常漂亮,能在國慶前就拿到一個不錯的offer回家算是一個完美的開局了,不過接下去的10月,11月才是重頭戲,希望也能完美收官吧。剛剛回到家里,打算把前兩天筆試面試中碰到的一些題目記錄在這里,并給出自己的實現(xiàn)。以后每過一階段都會在這里總結(jié)一次碰到的題目,加以整理和進一步的思考,為后面的硬仗做好充分的準備。fighting~

            快慢指針判斷單鏈表是否有環(huán)
            這題是出現(xiàn)在筆試題里的一道選擇題,考試的時候我愣是不知道快慢指針是啥,于是猜了一個錯了,回到寢室后google了一下,發(fā)現(xiàn)這是判斷單鏈表是否有環(huán)的最經(jīng)典的方案,對自己連這么基本的知識都不知道相當(dāng)無語啊,于是趕緊實現(xiàn)了一下,相信這輩子也不會忘了吧
             1#include <iostream>
             2#include <string>
             3using namespace std;
             4
             5typedef struct list_node
             6{
             7    int x;
             8    struct list_node* next;
             9}
            node, *pnode;
            10
            11bool isCircle(pnode list)
            12{
            13    pnode quick=list, slow=list;//快慢指針
            14    while(1)
            15    {
            16        if(quick==NULL || slow == NULL)//可以到達鏈表末尾說明無環(huán)
            17            return false;
            18        quick = quick->next;
            19        if(quick == NULL)
            20            return false;
            21        quick = quick->next;
            22        slow = slow->next;
            23
            24        if(slow==quick)//慢指針趕上快指針說明有環(huán)
            25            return true;
            26    }

            27}

            28
            29int main()
            30{
            31    pnode list = NULL, temp;
            32
            33    for(int i=1;i<=10;i++)
            34    {
            35        pnode pn = new node;
            36        pn->= i;
            37        pn->next = list;
            38        list = pn;
            39    }

            40    
            41    temp = list;
            42    for(int i=0;i<10;i++, temp=temp->next)
            43        cout<<temp->x<<" ";
            44    cout<<endl;
            45
            46    if(isCircle(list))
            47        cout<<"有環(huán)"<<endl;
            48    else
            49        cout<<"無環(huán)"<<endl;
            50
            51    //手工構(gòu)造一個環(huán)
            52    pnode tail = list;
            53    while(tail->next != NULL)
            54        tail = tail->next;
            55    tail->next = list;
            56
            57    if(isCircle(list))
            58        cout<<"有環(huán)"<<endl;
            59    else
            60        cout<<"無環(huán)"<<endl;
            61
            62    for(int i=0;i<10;i++)
            63    {
            64        temp = list->next;
            65        delete list;
            66        list = temp;
            67    }

            68
            69    return 0;
            70}

            原地刪除給定字符串中的指定字符
            一聽到面試官說要原地算法,第一反應(yīng)就是交換,于是秒殺
             1#include <iostream>
             2#include <string>
             3using namespace std;
             4
             5//原地刪除字符串中的指定字符
             6char* del_char(char *str, char del)
             7{
             8    int n = strlen(str);
             9    int i,j;
            10    for(i=0;i<n;i++)
            11    {
            12        if(str[i]==del)
            13        {
            14            j=i;
            15            while(str[j]==del)
            16                j++;
            17            swap(str[i], str[j]);
            18            if(str[i]=='\0')
            19                return str;
            20        }

            21    }

            22    return str;
            23}

            24
            25int main()
            26{
            27    char str[] = "banana";
            28    cout<<del_char(str, 'a')<<endl;
            29
            30    return 0;
            31}

            求給定數(shù)組的連續(xù)最大和子數(shù)組
            經(jīng)典的動態(tài)規(guī)劃,programming pearl上給了四種解法,對divide&conquer和DP的兩種解法應(yīng)該都是了然于心的,于是又秒殺。之后面試官要求記錄最大子數(shù)組的索引,想了想,繼續(xù)秒殺

             1#include <iostream>
             2#include <string>
             3using namespace std;
             4
             5int x=-1, y=-1;//x,y用來記錄最大子數(shù)組的起始和結(jié)束位置
             6
             7//動態(tài)規(guī)劃,求最大子數(shù)組和
             8int maxsubarray(int a[], int n)
             9{
            10    int max = 0, temp;//temp用來記錄每次新的可能的最長子數(shù)組的開始位置
            11    int maxendinghere = 0;
            12    for(int i=0;i<n;i++)
            13    {
            14        if(maxendinghere+a[i]>=0)//特別注意這里是大于等于,不能忘記等于
            15        {
            16            if(maxendinghere==0)
            17                temp = i;
            18            maxendinghere += a[i];
            19        }

            20        else
            21            maxendinghere = 0;
            22
            23        if(maxendinghere > max)
            24        {
            25            max = maxendinghere;
            26            y = i;
            27            x = temp;
            28        }

            29    }

            30
            31    return max;
            32}

            33
            34int main()
            35{
            36    int array[] = {2,-3,4};
            37    int len = sizeof(array)/sizeof(array[0]);
            38    for(int i=0;i<len;i++)
            39        cout<<array[i]<<" ";
            40    cout<<endl;
            41
            42    cout<<"最大連續(xù)子數(shù)組和為: "<<maxsubarray(array, len)<<endl;
            43    cout<<"范圍: "<<"["<<x<<","<<y<<"]"<<endl;
            44
            45    return 0;
            46}

            最大子矩陣問題,給出O(N^3)的算法
            事實上就是上一題的二維版本,話說也是經(jīng)典題,結(jié)果愣是做了我半天沒搞定,主要是下標老是被我寫錯。。。很郁悶,回寢室后也改了半天才總算寫對,還是缺少寫DP的練習(xí)啊
             1#include <iostream>
             2#include <string>
             3using namespace std;
             4
             5//動態(tài)規(guī)劃,預(yù)計算子矩陣(左上角為(0,0)的子矩陣),O(n*m)
             6//狀態(tài)轉(zhuǎn)移方程:SM[i,j]=SM[i-1,j]+SM[i,j-1]-SM[i-1,j-1]+M[i-1,j-1],注意SM和M下標的不同
             7//初始狀態(tài):SM[0,j]=0, SM[i,0]=0
             8int* cal_submatrix(int M[], int n, int m)
             9{
            10    n++;m++;
            11    int *SM = new int[n*m];
            12    int i,j;
            13    for(i=0;i<n;i++)
            14        SM[i*m] = 0;
            15    for(j=0;j<m;j++)
            16        SM[j] = 0;
            17    
            18    for(i=1;i<n;i++)
            19        for(j=1;j<m;j++)
            20            SM[i*m+j] = SM[(i-1)*m+j]+SM[i*m+j-1]-SM[(i-1)*m+j-1]+M[(i-1)*(m-1)+j-1];
            21    
            22    return SM;
            23}

            24
            25//求n*m矩陣的最大和子矩陣,即求連續(xù)最大和子數(shù)組的二維版本
            26//利用已經(jīng)預(yù)計算的子矩陣在常量時間內(nèi)把二維問題轉(zhuǎn)化為一維問題
            27//C[k]=SM[down,k]-SM[up-1,k]-SM[down,k-1]+SM[up-1,k-1]
            28int maxsubmatrix(int M[], int SM[], int n, int m)
            29{
            30    int up,down,maxendinghere,k,Ck;
            31    int max = 0;
            32    //遍歷上下界
            33    for(up=0;up<n;up++)
            34    {
            35        for(down=up;down<n;down++)
            36        {
            37            //把問題看成一維的情況來解
            38            maxendinghere = 0;
            39            for(k=0;k<m;k++)
            40            {
            41                Ck = SM[(down+1)*(m+1)+k+1]-SM[up*(m+1)+k+1]-SM[(down+1)*(m+1)+k]+SM[up*(m+1)+k];//常量時間求第k列在[down,up]內(nèi)的和
            42                if(maxendinghere+Ck >= 0)
            43                    maxendinghere+=Ck;
            44                else
            45                    maxendinghere = 0;
            46
            47                if(maxendinghere > max)
            48                    max = maxendinghere;
            49            }

            50        }

            51    }

            52
            53    return max;
            54}

            55
            56int main()
            57{
            58    int array[] = {2,-3,4,1,2,-3,6,2,5,2,-1,-6};
            59    int n=3, m=4;
            60    cout<<"原始矩陣:"<<endl;
            61    for(int i=0;i<n;i++)
            62    {
            63        for(int j=0;j<m;j++)
            64            cout<<array[i*m+j]<<" ";
            65        cout<<endl;
            66    }

            67
            68    int *SM = cal_submatrix(array, n, m);
            69
            70    cout<<"預(yù)計算矩陣:"<<endl;
            71    for(int i=0;i<=n;i++)
            72    {
            73        for(int j=0;j<=m;j++)
            74            cout<<SM[i*(m+1)+j]<<" ";
            75        cout<<endl;
            76    }

            77
            78    cout<<"子矩陣最大和: "<<maxsubmatrix(array,SM, n, m)<<endl;
            79    delete [] SM;
            80
            81    return 0;
            82}

            總結(jié)
            總的來說,題目雖然都不難,但是在面試的時候要求當(dāng)場在紙上寫出代碼還是相當(dāng)考驗人的,畢竟這時候你得不到IDE的幫助,只能在自己腦子里debug,光能描述出算法的思想還是不夠的,還是得多練練碼代碼的能力啊,平時練的時候最好是別用F5,有錯直接用眼睛看,用腦子想,當(dāng)然啦,真正寫程序的時候還得依賴debug,但在實現(xiàn)一些不太復(fù)雜的算法時完全可以這么做,我相信一定有好處的。

            ps:面試結(jié)束后同學(xué)告訴我很多題《編程之美》上都有,可憐我一年前就買了這本書到現(xiàn)在都沒看過,看來國慶得花時間翻翻了啊

            posted on 2009-09-30 16:27 翼帆 閱讀(963) 評論(0)  編輯 收藏 引用 所屬分類: 算法筆試/面試

            導(dǎo)航

            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統(tǒng)計

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            国内精品伊人久久久久av一坑| 蜜臀av性久久久久蜜臀aⅴ| 久久国产乱子精品免费女| 狠狠色丁香久久婷婷综| 成人国内精品久久久久影院VR| 久久精品国产精品亚洲人人| 久久久久久国产a免费观看黄色大片| 一本一道久久综合狠狠老| 俺来也俺去啦久久综合网| 久久久久九国产精品| 亚洲AV日韩精品久久久久| 久久精品国产亚洲Aⅴ香蕉| 国内精品久久久久影院薰衣草| 日本福利片国产午夜久久| 欧美日韩久久中文字幕| 99久久精品国产一区二区| 久久精品国产亚洲av日韩| 伊人久久五月天| 人人狠狠综合久久亚洲高清| 99热成人精品热久久669| 午夜精品久久久久久中宇| 久久最新免费视频| 久久久久亚洲精品天堂久久久久久| 久久婷婷五月综合色奶水99啪| 欧美午夜A∨大片久久| 国产综合成人久久大片91| 国产AV影片久久久久久| 久久99免费视频| 狠狠久久亚洲欧美专区| 7777久久亚洲中文字幕| 久久精品中文闷骚内射| 久久久久亚洲av无码专区导航 | 99久久国产亚洲高清观看2024 | 一级做a爰片久久毛片免费陪| 国产成人精品久久综合| 情人伊人久久综合亚洲| 久久91精品国产91久久小草| 国产精品久久久久…| 国产精品久久久久久久久鸭| 久久99中文字幕久久| 久久最新精品国产|