免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
微軟面試中簡單的算法題目

算法題

1.鏈表和數(shù)組的區(qū)別在哪里?

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

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

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

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

 

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

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

 

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

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

 

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

ANSWER 首先要知道strstr()這個函數(shù)是干什么的,自己去查查C語言的書,一般附錄后面會給出C語言標準庫的。這個題目實際上也是一類重要的算法門類,叫做“字符串的模式匹配”。它有很多的現(xiàn)成算法,其中最簡單的要數(shù)樸素的匹配算法,還有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.編寫反轉(zhuǎn)字符串的程序,要求優(yōu)化速度、優(yōu)化空間。

ANSWER:循環(huán)當然是最簡單的。

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.在鏈表里如何發(fā)現(xiàn)循環(huán)鏈接?

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

 

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

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

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.給出一個函數(shù)來輸出一個字符串的所有排列。

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

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.給出一個函數(shù)來復制兩個字符串A和B。字符串A的后幾個字節(jié)和字符串B的前幾個字節(jié)重疊。

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

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.怎樣編寫一個程序,把一個有序整數(shù)數(shù)組放到二叉樹中?

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

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.怎樣從頂部開始逐層打印二叉樹結(jié)點數(shù)據(jù)?請編程。

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

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 前面說了,最基本的是最重要的。線性數(shù)據(jù)結(jié)構(gòu)是學習數(shù)據(jù)結(jié)構(gòu)的入門,一定要掌握好。微軟的題目還是跟國內(nèi)的公司不一樣。國內(nèi)的一上來就是些概念,跟考歷史一樣。

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;

}

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Style Your Mind: part of c/c++ algorithm code.
c++程序員面試寶典
面試題
二叉樹的查找方式
AC自動機算法詳
一步一步寫算法(之哈夫曼樹 下)
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服