亚洲免费人人妻人人,cao78在线视频,福建一级毛片,91精品视频免费观看,高清另类图片操逼,日本特黄特色大片免费看,超碰欧美人人澡曰曰澡夜夜泛

微軟算法面試題

學人智庫 時間:2018-01-13 我要投稿
【www.msguai.com - 學人智庫】

1、反轉(zhuǎn)一個鏈表。循環(huán)算法。

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、反轉(zhuǎn)一個鏈表。遞歸算法。

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、廣度優(yōu)先遍歷二叉樹。

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<n;++j){< p="">

6 if(j!=0 && s[j]==s[j-1]);

7 elseif(s[j]!='@'){

8 p[i]=s[j];

9 s[j]='@';

10 if(i==n-1){

11 p[n]='';

12 printf("%s", p);

13 }else{

14 perm(s,i+1,n);

15 }

16 s[j]=p[i];

17 }

18 }

19}

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

1void main() {

2 char s[N];

3 sort(s);

4 perm(s,0,strlen(s));

5}

5、輸入一個字符串,輸出長型整數(shù)。

1 long atol(char *str){

2 char *p = str;

3 long l=1;m=0;

4 if (*p=='-') {

5 l=-1;

6 ++p;

7 }

8 while(isDigit(*p)){

9 m = m*10 + p;

10 ++p;

11 }

12 if(!p) return m*l;

13 else return error;

14}

6、判斷一個鏈表是否有循環(huán)。

1 int isLoop(List l) {

2 if ( ! l) return - 1 ;

3 List s = l.next;

4 while (s && s != l) {

5 s = s.next;

6 }

7 if ( ! s) return - 1 ;

8 else reutrn 1 ;

9 }

-----------

1int isLoop(List l){

2 if(!l) return 0;

3 p=l.next;

4 wihle(p!=l&&p!=null) {

5 l.next=l;

6 l=p;p=p.next;

7 }

8 if(p=l) return 1;

9 return 0;

10}

實際上,在我的面試過程中,還問到了不破壞結(jié)構(gòu)的其他算法。

我的答案是從鏈表頭開始遍歷,如果節(jié)點next指針指向自身,則循環(huán)存在;否則將next指針指向自身,遍歷下一個節(jié)點。直至next指針為空,此時鏈表無循環(huán)。

7、反轉(zhuǎn)一個字符串。

1 void reverse( char * str) {

2 char tmp;

3 int len;

4 len = strlen(str);

5 for ( int i = 0 ;i < len / 2 ; ++ i) {

6 tmp = char [i];

7 str[i] = str[len - i - 1 ];

8 str[len - i - 1 ] = tmp;

9 }

10 }

8、實現(xiàn)strstr函數(shù)。

1int strstr(char[] str, char[] par){

2 int i=0;

3 int j=0;

4 while(str[i] && str[j]){

5 if(str[i]==par[j]){

6 ++i;

7 ++j;

8 }else{

9 i=i-j+1;

10 j=0;

11 }

12 }

13 if(!str[j]) return i-strlen(par);

14 else return -1;

15}

9、實現(xiàn)strcmp函數(shù)。

1int strcmp(char* str1, char* str2){

2 while(*str1 && *str2 && *str1==*str2){

3 ++str1;

4 ++str2;

5 }

6 return *str1-*str2;

7}

10、求一個整形中1的位數(shù)。

1 int f( int x) {

2 int n = 0 ;

3 while (x) {

4 ++ n;

5 x &= x - 1 ;

6 }

7 return n;

8 }

11、漢諾塔問題。

1void tower(n,x,y,z){

2 if(n==1) move(x,z);

3 else {

4 tower(n-1, x,z,y);

5 move(x,z);

6 tower(n-1, y,x,z);

7 }

8}

12、三柱漢諾塔最小步數(shù)。

1 int f3(n) {

2 if (f3[n]) return f3[n];

3 else {

4 if (n == 1 ) {

5 f3[n] = 1 ;

6 return 1 ;

7 }

8 f3[n] = 2 * f3(n - 1 ) + 1 ;

9 return f3[n];

10 }

11 }

四柱漢諾塔最小步數(shù)。

1int f4(n){

2 if(f4[n]==0){

3 if(n==1) {

4 f4[1]==1;

5 return 1;

6 }

7 min=2*f4(1)+f3(n-1);

8 for(int i=2;i<n;++i){< p="">

9 u=2*f4(i)+f3(n-i);

10 if(u

11 }

12 f4[n]=min;

13 return min;

14 } else return f4[n];

15}

13、在一個鏈表中刪除另一個鏈表中的元素。

1void (List m, List n) {

2 if(!m || !n) return;

3 List pre = new List();

4 pre.next=m;

5 List a=m, b=n,head=pre;

6 while(a && b){

7 if(a.value < b.value) {

8 a=a.next;

9 pre=pre.next;

10 }else if(a.value > b.value){

11 b=b.next;

12 }else{

13 a=a.next;

14 pre.next=a;

15 }

16 }

17 m=head.next;

18}

14、一個數(shù)組,下標從0到n,元素為從0到n的整數(shù)。判斷其中是否有重復元素。

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

2 for(int i=0;i<n;++i){< p="">

3 while(a[i]!=i && a[i]!=-1){

4 if(a[a[i]]==-1) return 1;

5 a[i]=a[a[i]];

6 a[a[i]]=-1;

7 }

8 if(a[i]==i) {a[i]=-1;}

9 }

10 return 0;

11}

15、判斷一顆二叉樹是否平衡。

1int isB(Tree t){

2 if(!t) return 0;

3 int left=isB(t.left);

4 int right=isB(t.right);

5 if( left >=0 && right >=0 && left - right <= 1 || left -right >=-1)

6 return (left<right)? p="" +="" 1);<="" left="" :="" right="">

7 else return -1;

8}

9

16、返回一顆二叉樹的深度。

1int depth(Tree t){

2 if(!t) return 0;

3 else {

4 int a=depth(t.right);

5 int b=depth(t.left);

6 return (a>b)?(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、將長型轉(zhuǎn)換為字符串。

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、用一個數(shù)據(jù)結(jié)構(gòu)實現(xiàn)

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、不重復地輸出升序數(shù)組中的元素。

1 void outputUnique( char [] str, int n) {

2 if (n <= 0 ) return ;

3 elseif(n == 1 ) putstr[ 0 ]);

4 else {

5 int i = 0 ,j = 1 ;

6 putstr[ 0 ]);

7 while (j < n) {

8 if (str[j] !== str[i]) {

9 putstr[j]);

10 i = j;

11 }

12 ++ j;

13 }

14 }

15 }

22、面試過程中我還遇到了下面幾題:

1、如何刪除鏈表的倒數(shù)第m的元素?我的方法是先用pre指針從鏈表頭開始步進m,新建pst節(jié)點next指針指向頭節(jié)點,cur指針指向頭節(jié)點,然后pre,cur,post三個指針一起步進,當pre指向鏈表結(jié)尾的時候cur指向倒數(shù)第m個元素,最后利用pst指針刪除cur指向元素。

2、如何判斷一個字符串是對稱的?如a,aa,aba。設置頭尾指針同時向中間比較靠齊直至相遇。

3、如何利用2函數(shù)找出一個字符串中的所有對稱子串?以子串頭指針和尾指針為循環(huán)變量設置兩個嵌套的循環(huán)以找出所有子串,對每個子串應用2函數(shù)。

[微軟算法面試題]