<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 195, comments - 34, trackbacks - 0, articles - 1

    幾道面試筆試題

    Posted on 2010-05-03 17:25 小強摩羯座 閱讀(148) 評論(0)  編輯  收藏
    幾道面試筆試題
    2008-02-26 18:38

    一、如何判斷一個單鏈表是有環的?(注意不能用標志位,最多只能用兩個額外指針)
       struct node { char val; node* next;}
       bool check(const node* head) {} //return false : 無環;true: 有環
        一種O(n)的辦法就是(搞兩個指針,一個每次遞增一步,一個每次遞增兩步,如果有環的話兩者必然重合,反之亦然):
        bool check(const node* head)
        {
             if(head==NULL)
                  return false;  
             node *low=head, *fast=head->next;
             while(fast!=NULL && fast->next!=NULL)
            {
                   low=low->next;
                   fast=fast->next->next;
                   if(low==fast)
                        return true;
            }
           return false;
       }

    二、刪除一個單項鏈表的最中間的元素,要求時間盡可能短(不能使用兩次循環)
    struct link
    {
        int data;
        struct link *next;
    };
    void delMiddle(link *head)
    {
        if(head == NULL)
               return;
        else if(head->next == NULL)
        {
                delete head;
                return;
        }
        else
        {
                link *low = head;
                link *fast = head->next;
                while(fast != NULL && fast->next != NULL)
                {  
                           fast = fast->next->next;
                           if(fast == NULL)
                                        break;
                           low = low->next;
                }
                link *temp = low->next;
                low->next = low->next->next;
                delete temp;

        }
    }
    int main()
    {
           struct link *head,*l;
           struct link *s;
           head = (link*)malloc(sizeof(link));
           head->data=0;
           head->next = NULL;
           l = head;
           for(int i=1; i<9; i++)
           {
                s = (link*)malloc(sizeof(link));
                s->data = i;
                s->next = NULL;
                l->next= s;
                l = l->next;
           }
           print(head);
           delMiddle(head);
           print(head);
           return 0;
    }

    三、輸入n,求一個n*n矩陣,規定矩陣沿45度線遞增(威盛)
    /**
    * 得到如下樣式的二維數組
    * zigzag(jpeg編碼里取象素數據的排列順序)
    *
    *   0, 1, 5, 6,14,15,27,28,
    *   2, 4, 7,13,16,26,29,42,
    *   3, 8,12,17,25,30,41,43,
    *   9,11,18,24,31,40,44,53,
    *   10,19,23,32,39,45,52,54,
    *   20,22,33,38,46,51,55,60,
    *   21,34,37,47,50,56,59,61,
    *   35,36,48,49,57,58,62,63
    */
    void zigzag(int n)
    {
    int **a =(int**) malloc(n*sizeof(int *)); //分配空間

    if(NULL == a)
    return ;
    int i;
    for(i = 0; i < n; i++) {
            if((a[i] =(int*) malloc(n * sizeof(int))) == NULL) {
                while(--i>=0)
                    free(a[i]);
                free(a);
                return;
            }
        }

    bool flag = false; //這個標志位用來判斷是從45度角生成還是225度角生成
    int count = 0;
    for(i=0; i<n; i++) //生成的上半部分的數據
    {

    if(flag)
    {
       for(int r = 0; r<=i; r++)
       {
        a[r][i-r] = count;
        count++;
       }
       flag = false;
    }
    else
    {
       for(int r = i; r>=0; r--)
       {
        a[r][i-r] = count;
        count++;
       }
       flag = true;
    }
    }
    for(i=n-1; i>=0; i--) //生成的是下半部分的數據
    {
    // cout<<i<<endl;
    if(flag)
    {
       for(int r = 0; r<=i-1; r++)
       {
        int r1 = n-i+r;       //代表當前行
        int c1 = 2*n-i-1-r1; //代表當前列
        a[r1][c1] = count;
        count++;
       }
       flag = false;
    }
    else
    {
       for(int r = i-1; r>=0; r--)
       {
        cout<<"ddd"<<endl;
        int r1 = n-i+r;
        int c1 = 2*n-i-1-r1;
    //   cout<<r1<<","<<c1<<endl;
        a[r1][c1] = count;
        count++;
       }
       flag = true;
    }
    }
    for(int r = 0; r<n; r++)
    {
    for(int c=0; c<n; c++)
       cout<<a[r][c]<<",";
    cout<<endl;
    }
    }
    int main()
    {
    int n;
    cin>>n;
    zigzag(n);
    return 0;
    }
    網上還有一個人寫了一個比較巧的算法:
    /**
    * 得到如下樣式的二維數組
    * zigzag(jpeg編碼里取象素數據的排列順序)
    *
    *   0, 1, 5, 6,14,15,27,28,
    *   2, 4, 7,13,16,26,29,42,
    *   3, 8,12,17,25,30,41,43,
    *   9,11,18,24,31,40,44,53,
    *   10,19,23,32,39,45,52,54,
    *   20,22,33,38,46,51,55,60,
    *   21,34,37,47,50,56,59,61,
    *   35,36,48,49,57,58,62,63
    */

    #include <stdio.h>
    int main()
    {
        int N;
        int s, i, j;
        int squa;
        scanf("%d", &N);
        /* 分配空間 */
        int **a = malloc(N * sizeof(int *));
        if(a == NULL)
            return 0;
        for(i = 0; i < N; i++) {
            if((a[i] = malloc(N * sizeof(int))) == NULL) {
                while(--i>=0)
                    free(a[i]);
                free(a);
                return 0;
            }
        }
        /* 數組賦值 */
        squa = N*N;   
        for(i = 0; i < N; i++)
            for(j = 0; j < N; j++) {
                s = i + j;
                if(s < N)
                    a[i][j] = s*(s+1)/2 + (((i+j)%2 == 0)? i : j);
                else {
                    s = (N-1-i) + (N-1-j);
                    a[i][j] = squa - s*(s+1)/2 - (N - (((i+j)%2 == 0)? i : j));
                }
            }
        /* 打印輸出 */   
        for(i = 0; i < N; i++) {
            for(j = 0; j < N; j++)
                printf("%-6d", a[i][j]);
            printf("\n");
        }
        return 0;
    }


    四、打印1到1000的整數,不能使用流程控制語句(for,while,goto等)也不能使用遞歸
    1.
    typedef struct _test{
        static int a;
        _test(){
            printf("%d\n",_test::a);
            a++;
        }
    }Test;
    int Test::a = 1;

    int   main()  
    {  
        Test tt[1000];
        return 0;
    }  
    2.
    #include   <stdio.h>
    #define   B   P,P,P,P,P,P,P,P,P,P
    #define   P   L,L,L,L,L,L,L,L,L,L
    #define   L   I,I,I,I,I,I,I,I,I,I,N
    #define   I   printf( "%3d   ",i++)
    #define   N   printf( "\n ")
    int main()
    {
        int   i   =   1;
        B;
    }

    #define A(x) x;x;x;x;x;x;x;x;x;x;
    int main ()
    {
        int n = 1;
        A(A(A(printf ("%d ", n++))));

        return 0;
    }

     

    五、struct   S   {
            int   i;
            int   *   p;
    };
    void   main()
    {
            S   s;
            int   *   p   =   &s.i;
            p[0]   =   4;
            p[1]   =   3;
            s.p   =   p;
            s.p[1]   =   1;
            s.p[0]   =   2;
    }
    問程序會在哪一行死掉。 (microsoft)
    解: S   s;
             int   *   p   =   &s.i;        //s.i的地址存儲在p里
            p[0]   =   4;                    //修改了s.i
             p[1]   =   3;                    //修改了s.p
             s.p   =   p;                    //s.p指向s.i
             s.p[1]   =   1;               //修改s.p本身
            s.p[0]   =   2;               //s.p指向的是0x00000001,嘗試向這里寫,出錯
         s.p[0]       =       2;   時出錯
         因為s.p存的是s.i的地址,s.p[1]為s.p,當s.p[1]=1時,s.p此時存放的是1了,而不是地址s.i,故在s.p[0]   =   2時出錯.
    此時相當于s.p=ox00000001;地址ox0000001   =   2;當然就出錯了

    如果語句s.p[0]   =2   先于s.p[1]=1則程序就不會出錯.此時語句相當于s.i=2;s.p=1;


    六、題目描述:
    1.   int   swap(int   *x,int   *y)
    {
        if(x==NULL   | |   y==NULL)
            return   -1;
        *x   +=   *y;
        *y   =   *x-   *y;
        *x   -=   *y;
          return   1;
    }
    請改錯,溢出已經考慮,不是錯誤
    2.
    void   foo(int   *x,   int   *y)
    {
        *x   +=   *y;
        *x   +=   *y;
    }
    void   fun(int   *x,   int   *y)
    {  
        *x   +=   2   *   (*y);
    }
    問兩個函數是否等價,能否互換
    解答:第一題的函數是交換。但假如考慮x,   y都是指向同一個變量,結果是這個變量的值為0.
    第二題的兩個函數是有區別的,也考慮x,y是指向同一個變量.這樣第一個函數的結果是這個變量的4倍.但第二個函數的結果是變量的3倍.




    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 一区视频免费观看| 久久精品视频亚洲| 亚洲高清有码中文字| 99久久综合精品免费| 国产l精品国产亚洲区在线观看| 91av免费在线视频| 亚洲精品无码永久在线观看男男 | 亚洲精品在线免费看| 无码人妻AV免费一区二区三区| 国产精品亚洲产品一区二区三区 | 成年女人男人免费视频播放| 亚洲国产成人综合| 欧洲精品成人免费视频在线观看 | 国产又黄又爽胸又大免费视频| 国产成人99久久亚洲综合精品 | 性色av极品无码专区亚洲| a毛片全部免费播放| 亚洲国产另类久久久精品黑人| 黄色网址在线免费| 国产大片51精品免费观看| 精品国产日韩亚洲一区91| 又大又粗又爽a级毛片免费看| 一本岛v免费不卡一二三区| 国产成人亚洲精品狼色在线| 国产猛男猛女超爽免费视频| 91亚洲国产成人精品下载| 97在线观免费视频观看| 老司机免费午夜精品视频| 亚洲色大成网站www永久一区| 亚洲精品无码少妇30P| 免费少妇a级毛片人成网| 国产免费阿v精品视频网址| 亚洲成人午夜电影| 在线观看亚洲免费| 人妻免费一区二区三区最新| 亚洲国产综合精品| av无码东京热亚洲男人的天堂| 亚洲最大免费视频网| 国产免费啪嗒啪嗒视频看看| 亚洲综合丁香婷婷六月香| 69式互添免费视频|