日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

微软面试中简单的算法题目(转)

發(fā)布時(shí)間:2025/3/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微软面试中简单的算法题目(转) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
微軟面試中簡(jiǎn)單的算法題目(轉(zhuǎn))


(說明:這些題就不是什么花樣了,考的是你的基礎(chǔ)知識(shí)怎么樣。再聰明而沒有實(shí)學(xué)的人都將會(huì)被這些題所淘汰。)?
1.鏈表和數(shù)組的區(qū)別在哪里?

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

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

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

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

?

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

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

?

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

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

?

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

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

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

?

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

分析 :簡(jiǎn)單!掃描一遍,每次生成對(duì)應(yīng)整數(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.給出一個(gè)函數(shù)來輸出一個(gè)字符串的所有排列。

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

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

anSwer? 記住,這種題目往往就是考你對(duì)邊界的考慮情況。編程除了技術(shù)上的熟練以外,細(xì)心也是非常重要的。其實(shí)很多編程的大師可能并不是有特別的技術(shù),往往就是他們 非常的耐心和細(xì)心,記住:編程是計(jì)算機(jī)科學(xué)中最基本的工作,它是最容易去掌握的,耐心點(diǎn),細(xì)心點(diǎn)你一定能夠?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.怎樣編寫一個(gè)程序,把一個(gè)有序整數(shù)數(shù)組放到二叉樹中?

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

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é)點(diǎn)數(shù)據(jù)?請(qǐng)編程。

ANSWER 二叉樹的層次遍歷沒什么好說的,如果你不會(huì)還是早點(diǎn)把基礎(chǔ)復(fù)習(xí)一下。一個(gè)勁的往后學(xué),才會(huì)發(fā)現(xiàn)原來最最重要的還是以前最基礎(chǔ)最簡(jiǎ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.怎樣把一個(gè)鏈表掉個(gè)順序(也就是反序,注意鏈表的邊界條件并考慮空鏈表)?

ANSWER 前面說了,最基本的是最重要的。線性數(shù)據(jù)結(jié)構(gòu)是學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的入門,一定要掌握好。微軟的題目還是跟國內(nèi)的公司不一樣。國內(nèi)的一上來就是些概念,跟考?xì)v史一樣。

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;

}

轉(zhuǎn)載于:https://www.cnblogs.com/zhoutian6214/archive/2008/09/21/1295141.html

總結(jié)

以上是生活随笔為你收集整理的微软面试中简单的算法题目(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。