• <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>
            posts - 297,  comments - 15,  trackbacks - 0
            (說明:這些題就不是什么花樣了,考的是你的基礎知識怎么樣。再聰明而沒有實學的人都將會被這些題所淘汰。) 
            1.鏈表和數組的區別在哪里?

            ANSWER 主要在基本概念上的理解。但是最好能考慮的全面一點,現在公司招人的競爭可能就在細節上產生,誰比較仔細,誰獲勝的機會就大。

            1)數組在內存中是逐個存放的,也就是說倘若數組的第一個元素在地址A,則數組第二個元素就在地址A+1。而鏈表則不是,鏈表每個節點沒有相對固定的位置關系。某個節點在地址A其后的節點不一定是A+1,而在內存的其他空閑區域,呈現一種隨機的狀態。

            2)數組一旦顯式的被申明后,其大小就固定了,不能動態進行擴充。而鏈表則可以,可以動態生成節點并且添加到已有的鏈表后面。

            3) …… (大家一起想想)

             

            2.編寫實現鏈表排序的一種算法。說明為什么你會選擇用這樣的方法?

            ANSWER 鏈表通常是插入排序,為什么呢?在數組中插入排序實現時會大量的移動數據從而刪除位置不正確的元素,這是順序表刪除操作的低效性。從數學的角度,順序表 (即數組)的刪除操作是O(n).鏈表就不同,由于其存儲位置的不固定性,其刪除固定位置的元素只需要O(1)的時間,所以整體性能上獲得比較大的提高。

             

            3.編寫實現數組排序的一種算法。說明為什么你會選擇用這樣的方法?

            ANSWER 排序算法非常成熟了,實際上排序是研究算法的很有效例子?;卮鸬臅r候盡量找一些比較有技術性的算法,比如堆排序或者快速排序,如果寫冒泡什么的,別人都會 寫,也就顯示不出你的優秀了。當然一定要注意給定的條件。不至于三個數讓你排序,你搞個快排,這就有點“宰牛刀殺雞”了。

             

            4.請編寫能直接實現strstr()函數功能的代碼。

            ANSWER 首先要知道strstr()這個函數是干什么的,自己去查查C語言的書,一般附錄后面會給出C語言標準庫的。這個題目實際上也是一類重要的算法門類,叫做 “字符串的模式匹配”。它有很多的現成算法,其中最簡單的要數樸素的匹配算法,還有KMP,BM這些高級算法,筆試估計是來不及寫的。下面給出樸素的匹配 算法。

            int stringMatching(char* pattern,char* text)

            {

                     int pLen = strlen(pattern),tLen = strlen(text);

                     for(int i = 0;i <= tLen - pLen;i++){

                  for(int j = 0; pattern[j] == text[i + j];j++);

                               if(j == pLen) return i;

                     }

                     return -1; // Not found

            }

             

             

            5.編寫反轉字符串的程序,要求優化速度、優化空間。

            ANSWER:循環當然是最簡單的。

            void reverseString(char* str)

            {

                     int n = strlen(str);

                     for(int i = 0;i < n/2;i++)

                     {int t = str[i];str[i] = str[n - i - 1];str[n - i - 1] = t;}

            }

             

            6.在鏈表里如何發現循環鏈接?

            ANSWER: 顯然只需要判斷是否存在回溯指針就行了。判斷,是否存在某個節點的后繼指向其前面位置的指針。具體實現的時候可以模仿DFS中的訪問標志數組的方法,我們可以在struct node中設計該節點的一個訪問標志位,設為visited 。每訪問一個節點就將其visited域置為1。這樣的話,一次遍歷下來,如果發現某個后續節點的visited域已經是1,那么就可以判定其存在循環鏈接。具體的代碼就不寫了,太簡單了。

            bool findloop(node *head)

             { node *pf=head;

               node *ps=head->next;

               while(pf!=NULL&&ps!=NULL&&pf->next!=NULL&&ps->next!=NULL)

               { pf=pf->next;

                 ps=ps->next->next;

                 if(pf==ps)return true;

               }

            return false;

             }


            7.寫一個函數,檢查字符是否是整數,如果是,返回其整數值。(或者:怎樣只用4行代碼編寫出一個從字符串到長整形的函數?)

            分析 :簡單!掃描一遍,每次生成對應整數的最高位。一行也就搞定了!

            long convert(char* s_string,long s_integer)

            {

            for(int sLen = strlen(s_string), i = 0; i < sLen;s_integer += (s_string[i++] - '0')*pow(10,sLen - i - 1));

                     return s_integer;

            }

             

            8.給出一個函數來輸出一個字符串的所有排列。

            ANSWER 簡單的回溯就可以實現了。當然排列的產生也有很多種算法,去看看組合數學,還有逆序生成排列和一些不需要遞歸生成排列的方法。印象中Knuth的< TAOCP>第一卷里面深入講了排列的生成。這些算法的理解需要一定的數學功底,也需要一定的靈感,有興趣最好看看。

            void permStr(char* str,int i)

            {

                     if(i == strlen(str) - 1)

                       printf("%s\n",str);

                     else

                     {

                        for(int j = i;j < strlen(str);j++)

                        {

                                  swap(&str[i],&str[j]);

                                  permStr(str,i + 1);

                                  swap(&str[i],&str[j]);

                        }

                     }

            }

             

            9.給出一個函數來復制兩個字符串A和B。字符串A的后幾個字節和字符串B的前幾個字節重疊。

            anSwer  記住,這種題目往往就是考你對邊界的考慮情況。編程除了技術上的熟練以外,細心也是非常重要的。其實很多編程的大師可能并不是有特別的技術,往往就是他們 非常的耐心和細心,記?。壕幊淌怯嬎銠C科學中最基本的工作,它是最容易去掌握的,耐心點,細心點你一定能夠學好它。代碼看下面:

            char* myStrcpy(char* s,char* a,char* b,char n)

            {

            int aLen = strlen(a),bLen = strlen(b);

                     if(n > aLen || n > bLen)

                               return NULL; // Error

                     for(int i = 0;i < aLen + bLen - n;i++)

                               if(i < aLen - n) s[i] = a[i];

                               else s[i] = b[i - aLen + n];

                               s[i] = '\0';

                               return s;

            }

             

            10.怎樣編寫一個程序,把一個有序整數數組放到二叉樹中?

            ANSWER :二叉搜索樹的建樹方法。簡單的遞歸結構。實在不理解,干脆記下來好了。關于樹的算法設計一定要聯想到遞歸,因為樹本身就是遞歸的定義。這里的遞歸應該是 理所當然的吧,不過,學會把遞歸改稱非遞歸也是一種必要的技術。畢竟,遞歸會造成棧溢出,關于系統底層的程序中不到非不得以最好不要用。但是對某些數學問 題,就一定要學會用遞歸去解決。

            void insertNode(bTree** root,int val)

            {

                bTree* newNode = (bTree* ) malloc(sizeof(bTree));

                     newNode->data = val;

                    newNode->lChild = NULL;

                    newNode->rChild = NULL;

                  if(!(*root))

                        *root = newNode;

                else if(newNode->data < (*root)->data)

                      insertNode(&(*root)->lChild,val);

                     else

                      insertNode(&(*root)->rChild,val);  

            }

             

            11.怎樣從頂部開始逐層打印二叉樹結點數據?請編程。

            ANSWER 二叉樹的層次遍歷沒什么好說的,如果你不會還是早點把基礎復習一下。一個勁的往后學,才會發現原來最最重要的還是以前最基礎最簡單的。

            typedef struct myBinaryTree

            {

                     int data;

                     struct myBinaryTree* lChild;

                     struct myBinaryTree* rChild;

            } bTree;

             

            struct myQueen

            {

                     bTree* que[QSIZE];

                     int front;

                     int rear;

            } binQueue; // Global var

             

            void initQueue()

            {

                     // front == real makes the queue empty

                     binQueue.rear = QSIZE - 1;

                     binQueue.front = binQueue.rear;

                     for(int i = 0;i < QSIZE;i++)

                       binQueue.que[i] = NULL;

            }

             

            int enQueue(bTree* newNode)

            {

                     if(binQueue.front >= 1)

                     binQueue.que[binQueue.front--] = newNode;

                    

                     else return 0;

                     return 1;

            }

             

            bTree* deQueue()

            {

                     int t;

                  if(binQueue.front != binQueue.rear){

                     t = binQueue.rear;

                     binQueue.rear--;

                return binQueue.que[t];

                     }

                     else return NULL;

            }

            int levelTraversal(bTree** root)

            {

                     initQueue();

                     bTree* lc = (bTree* ) malloc(sizeof(bTree));

                     bTree* rc = (bTree* ) malloc(sizeof(bTree));

                     bTree* p = (bTree* ) malloc(sizeof(bTree));

                     if((!lc) || (!rc) || (!p)){

                     printf("OVERFLOW\n");

                     exit(OVERFLOW); // Allocation Error

                     }

                     p = *root;

                     if(!p) {

                               printf("Empty Tree,build it first !\n");

                         return 0;

                     }

                     enQueue(p); // enqueue the root of the tree

                  while (binQueue.front != binQueue.rear){

                   p = deQueue();

                        printf("%d ",p->data);

                        lc = p->lChild;

                        rc = p->rChild;

                        if(lc != NULL)

                                  enQueue(lc);

                      if(rc != NULL)

                                  enQueue(rc);

                     }

                     printf("\n");

                     return 1;

            }

             

            12.怎樣把一個鏈表掉個順序(也就是反序,注意鏈表的邊界條件并考慮空鏈表)?

            ANSWER 前面說了,最基本的是最重要的。線性數據結構是學習數據結構的入門,一定要掌握好。微軟的題目還是跟國內的公司不一樣。國內的一上來就是些概念,跟考歷史一樣。

            typedef struct listNode

            {

                     struct listNode* link;

                     int data;

            }node;

             

            node* getNode(node* newNode,int val)

            {

                if(!newNode)

                               exit(OVERFLOW);

                     newNode->link = NULL;

                     newNode->data = val;

                     return newNode;

            }

            /*

              Insert a new node after p

            */

            int insertNode(node* prev,node* newNode)

            {

                     if(!prev) return 0;

                     newNode->link = prev->link;

                     prev->link = newNode;

                return 1;

            }

            /*

             delete the node after the node prev

            */

            int eraseNode(node*prev,node* p)

            {

                     if(p == NULL)

                               return 0;

                     prev->link = p->link;

                     free(p);

                     return 1;

            }

            void buildList(node* head)

            {

                     int value;

                     node* newNode = (node* ) malloc(sizeof(node));

                     node* p = head;

                     scanf("%d",&value);

                     while(value != -1){

                     newNode = getNode(newNode,value);

                     insertNode(p,newNode);

                     p = p->link;

                     newNode = (node* ) malloc(sizeof(node));

                     scanf("%d",&value);

                     }

            }

             

            int reverseList(node* head)

            {

                     node* p = head->link;

                     node* q = p->link;

                     if(p == NULL){

                     printf("The list is empty!\n");

                     return 0;

                     }

                     while(q != NULL){

                node* newNode = (node* ) malloc(sizeof(node));

                     newNode = getNode(newNode,q->data);

                     insertNode(head,newNode);

                     eraseNode(p,q);

                     q = (node* ) malloc(sizeof(node)); // Allocate again

                     q = p->link;

                     }

                     p->link = NULL;

                  return 1;

            }

            http://blog.chinaunix.net/u2/76292/showart_1388527.html

            posted on 2009-12-06 23:31 chatler 閱讀(781) 評論(1)  編輯 收藏 引用 所屬分類: Algorithm

            FeedBack:
            # re: 微軟面試中簡單的算法題目(轉)
            2009-12-06 23:33 | chatler
            1.燒一根不均勻的繩子,從頭燒到尾總共需要 1 個小時,問如何用燒繩子
            的方法來確定半小時的時間呢?
            2.10 個海盜搶到了100 顆寶石,每一顆都一樣大小且價值連城。他們決定
            這么分:
            (1)抽簽決定自己的號碼(1~10);
            (2)首先,由1 號提出分配方案,然后大家表決,當且僅當超過半數的人
            同意時,按照他的方案進行分配,否則將被扔進大海喂鯊魚;
            (3)如果1 號死后,再由2 號提出分配方案,然后剩下的4 個人進行表決,
            當且僅當超過半數的人同意時,按照他的方案進行分配,否則將被扔入大海喂鯊
            魚;
            (4)依此類推??
            條件:每個海盜都是很聰明的人,都能很理智地做出判斷,從而做出選擇。
            問題:第一個海盜提出怎樣的分配方案才能使自己的收益最大化?
            3.為什么下水道的蓋子是圓的?
            4.中國有多少輛汽車?
            5.你讓工人為你工作7 天,回報是一根金條,這根金條平分成相連的7 段,
            你必須在每天結束的時候給他們一段金條。如果只允許你兩次把金條弄斷,你如
            何給你的工人付費?
            6.有一輛火車以每小時15 公里的速度離開北京直奔廣州,同時另一輛火車
            以每小時20 公里的速度從廣州開往北京。如果有一只鳥,以30 公里每小時的速
            度和兩輛火車同時啟動,從北京出發,碰到另一輛車后就向相反的方向返回去飛,
            就這樣依次在兩輛火車之間來回地飛,直到兩輛火車相遇。請問,這只鳥共飛行
            了多長的距離?
            7.你有兩個罐子以及50 個紅色彈球和50 個藍色彈球,隨機選出一個罐子,
            隨機選出一個彈球放入罐子,怎樣給出紅色彈球最大的選中機會?在你的計劃
            里,得到紅球的幾率是多少?
            8.想像你站在鏡子前,請問,為什么鏡子中的影像可以左右顛倒,卻不能
            上下顛倒呢?
            9.如果你有無窮多的水,一個3 公升的提捅,一個5 公升的提捅,兩只提
            捅形狀上下都不均勻,問你如何才能準確稱出4 公升的水?
            10.你有一桶果凍,其中有黃色、綠色、紅色三種,閉上眼睛抓取同種顏色
            的兩個。抓取多少次就可以確定你肯定有兩個同一顏色的果凍?
            11.連續整數之和為1000 的共有幾組?
            12.從同一地點出發的相同型號的飛機,可是每架飛機裝滿油只能繞地球飛
            半周,飛機之間可以加油,加完油的飛機必須回到起點。問至少要多少架次,才
            能滿足有一架繞地球一周。
            參考答案:
            1.兩邊一起燒。
            2.96,0,1,0,1,0,1,0,1,0。
            3.因為口是圓的。
            4.很多。
            5.分1,2,4。
            6.6/7 北京到廣州的距離。
            7.100%。
            8.平面鏡成像原理(或者是“眼睛是左右長的”)。
            9.3 先裝滿,倒在5 里,再把3 裝滿,倒進5 里。把5 里的水倒掉,把3 里
            剩下的水倒進5 里,再把3 裝滿,倒進5 里,ok!
            10.一次。
            11.首先1000 為一個解。連續數的平均值設為x,1000 必須是x 的整數倍。
            假如連續數的個數為偶數個,x 就不是整數了。x 的2 倍只能是5,25,125 才行。
            因為平均值為12.5,要連續80 個達不到。125/2=62.5 是可以的。即62,63,61,
            64,等等。連續數的個數為奇數時,平均值為整數。1000 為平均值的奇數倍。
            1000=2×2×2×5×5×5;x 可以為2,4,8,40,200 排除后剩下40 和200 是
            可以的。所以答案為平均值為62.5,40,200,1000 的4 組整數。
            12.答案是5 架次。一般的解法可以分為如下兩個部分:
            (1)直線飛行
            一架飛機載滿油飛行距離為1,n 架飛機最遠能飛多遠?在不是兜圈沒有迎
            頭接應的情況,這問題就是n 架飛機能飛多遠?存在的極值問題是不要重復飛
            行,比如兩架飛機同時給一架飛機加油且同時飛回來即可認為是重復,或者換句
            話說,離出發點越遠,在飛的飛機就越少,這個極值條件是顯然的,因為n 架飛
            機帶的油是一定的,如重復,則浪費的油就越多。比如最后肯定是只有一架飛機
            全程飛行,注意“全程”這兩個字,也就是不要重復的極值條件。如果是兩架飛
            機的話,肯定是一架給另一架加滿油,并使剩下的油剛好能回去,就說第二架飛
            機帶的油耗在3 倍于從出發到加油的路程上,有三架飛機第三架帶的油耗在5
            倍于從出發到其加油的路程上,所以n 架飛機最遠能飛行的距離為s=1+1/3+?
            +1/(2n+1)這個級數是發散的,所以理論上只要飛機足夠多最終可以使一架飛
            機飛到無窮遠,當然實際上不可能一架飛機在飛行1/(2n+1)時間內同時給n?1
            個飛機加油。
            (2)可以迎頭接應加油
            一架飛機載滿油飛行距離為1/2,最少幾架飛機能飛行距離1?也是根據不
            要重復飛行的極值條件,得出最遠處肯定是只有一架飛機飛行,這樣得出由1/2
            處對稱兩邊1/4 肯定是一架飛機飛行,用上面的公式即可知道一邊至少需要兩架
            飛機支持,(1/3+1/5)/2>1/4(左邊除以2 是一架飛機飛行距離為1/2),但
            是有一點點剩余,所以想像為一個滑輪(中間一個飛機是個繩子,兩邊兩架飛機
            是個棒)的話,可以滑動一點距離,就說加油地點可以在一定距離內變動(很容
            易算出來每架飛機的加油地點和加油數量,等等)  回復  更多評論
              
            <2009年7月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国产巨作麻豆欧美亚洲综合久久 | 久久久久久国产精品无码下载| 久久精品国产男包| 人人狠狠综合久久亚洲高清| 99久久国产主播综合精品| 久久99精品久久久久久久不卡| 久久天天躁狠狠躁夜夜avapp| 香蕉99久久国产综合精品宅男自| 久久www免费人成精品香蕉| 99久久国产亚洲高清观看2024| 久久精品国产亚洲沈樵| 久久精品国产一区| 99久久伊人精品综合观看| 久久精品国产福利国产琪琪| 久久久久99精品成人片三人毛片 | 亚洲嫩草影院久久精品| 精品久久久久中文字幕一区| 久久久久国色AV免费观看| 日韩影院久久| 久久综合久久自在自线精品自| www.久久热| 日韩久久久久中文字幕人妻| 亚洲国产精品一区二区三区久久| 精品国产青草久久久久福利| 国产精品久久一区二区三区| 久久伊人五月天论坛| 中文国产成人精品久久不卡| 精品国产一区二区三区久久| 久久中文精品无码中文字幕 | 综合久久国产九一剧情麻豆| 久久精品a亚洲国产v高清不卡 | 久久精品国产亚洲一区二区三区| 欧美成人免费观看久久| 91视频国产91久久久| 人妻精品久久久久中文字幕| 久久精品a亚洲国产v高清不卡| 久久亚洲欧洲国产综合| 91精品国产9l久久久久| 思思久久99热只有频精品66| 香港aa三级久久三级| 久久久亚洲AV波多野结衣|