微软的22道数据结构算法面试题(含答案)

来源:互联网 发布:vs2017 知乎 编辑:程序博客网 时间:2024/05/17 10:57

1、反转一个链表。循环算法。

1 List reverse(List l)

{

2 if(!l) return l;

3 list cur = l.next;

4 list pre = l;

5 list tmp;

6 pre.next = null;

7 while ( cur ) {

8 tmp = cur;

9 cur = cur.next;

10 tmp.next = pre

11 pre = tmp;

12 }

13 return tmp;

14 }

2、反转一个链表。递归算法。

1 List resverse(list l) {

2 if(!l || !l.next) return l;

3

4 List n = reverse(l.next);

5 l.next.next = l;

6 l.next=null;

7 }

8 return n;

9 }

3、广度优先遍历二叉树。

1 void BST(Tree t) {

2 Queue q = new Queue();

3 q.enque(t);

4 Tree t = q.deque();

5 while(t) {

6 System.out.println(t.value);

7 q.enque(t.left);

8 q.enque(t.right);

9 t = q.deque();

10 }

11 }

----------------------

1class Node {

2 Tree t;

3 Node next;

4 }

5class Queue {

6 Node head;

7 Node tail;

8 public void enque(Tree t){

9 Node n = new Node();

10 n.t = t;

11 if(!tail){

12 tail = head = n;

13 } else {

14 tail.next = n;

15 tail = n;

16 }

17 }

18 public Tree deque() {

19 if (!head) {

20 return null;

21 } else {

22 Node n = head;

23 head = head.next;

24 return n.t;

25 }

26}

4、输出一个字符串所有排列。注意有重复字符。

1char[] p;

2void perm(char s[], int i, int n){

3 int j;

4 char temp;

5 for(j=0;j b.value){

11 b=b.next;

12 }else{

13 a=a.next;

14 pre.next=a;

15 }

16 }

17 m=head.next;

18}

14、一个数组,下标从0到n,元素为从0到n的整数。判断其中是否有重复元素。

1int hasDuplicate(int[] a, int n){

2 for(int i=0;i=0 && right >=0 && left - right <= 1 || left -right >=-1)

6 return (leftb)?(a+1):(b+1);

7 }

8}

17、两个链表,一升一降。合并为一个升序链表。

1 List merge(List a, List d) {

2 List a1 = reverse(d);

3 List p = q = new List();

4 while ( a && a1 ) {

5 if (a.value < a1.value) {

6 p.next = a;

7 a = a.next;

8 } else {

9 p.next = a1;

10 a1 = a1.next;

11 }

12 p = p.next;

13 }

14 if (a) p.next = a;

15 elseif(a1) p.next = a1;

16 return q.next;

17 }

18、将长型转换为字符串。

1char* ltoa(long l){

2 char[N] str;

3 int i=1,n=1;

4 while(!(l/i<10)){i*=10;++n}

5 char* str=(char*)malloc(n*sizeof(char));

6 int j=0;

7 while(l){

8 str[j++]=l/i;

9 l=l%i;

10 i/=10;

11 }

12 return str;

13}

19、用一个数据结构实现

1 if (x == 0) y = a;

2 else y = b; 1 j[] = {a,b}; 2 y=j[x];

20、在双向链表中删除指定元素。 1void del(List head, List node){ 2 List pre=new List(); 3 pre.next = head; 4 List cur = head; 5 while(cur && cur!=node){ 6 cur=cur.next; 7 pre=pre.next; 8 } 9 if(!cur) return; 10 List post = cur.next; 11 pre.next=cur.next; 12 post.last=cur.last; 13 return; 14} 21、不重复地输出升序数组中的元素。 1 void outputUnique( char [] str, int n) { 2 if (n <= 0 ) return ; 3 elseif(n == 1 ) putchar(str[ 0 ]); 4 else { 5 int i = 0 ,j = 1 ; 6 putchar(str[ 0 ]); 7 while (j < n) { 8 if (str[j] !== str[i]) { 9 putchar(str[j]); 10 i = j; 11 } 12 ++ j; 13 } 14 } 15 } 22、面试过程中我还遇到了下面几题: 1、如何删除链表的倒数第m的元素?我的方法是先用pre指针从链表头开始步进m,新建pst节点next指针指向头节点,cur指针指向头节点,然后 pre,cur,post三个指针一起步进,当pre指向链表结尾的时候cur指向倒数第m个元素,最后利用pst指针删除cur指向元素。 2、如何判断一个字符串是对称的?如a,aa,aba。设置头尾指针同时向中间比较靠齐直至相遇。 3、如何利用2函数找出一个字符串中的所有对称子串?以子串头指针和尾指针为循环变量设置两个嵌套的循环以找出所有子串,对每个子串应用2函数。 该系列题目由http://www.cnblogs.com/wqguan/archive/2006/06/20/430347.html 的作者GwQ收集整理,我只是转贴