第七十九题合集 【微软面试100题 第七十九题】
题目要求:
问题1:编写实现链表排序的一种算法。
问题2:编写实现数组排序的一种算法。
问题3:编写能直接实现strstr()功能的代码。
问题分析:
问题1分析:
方法1 首先想到的是冒泡排序,因为简单;
方法2 如果内存空间允许,可以通过一个数组来辅助排序,时间复杂度O(NlogN),但是需要耗费空间复杂度.具体如下:
问题2分析:
对数组排序有很多种,根据时间复杂度和空间复杂度的具体要求具体选择,通常选择快排,时间复杂度O(NlogN).
问题3分析:
strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址;如果未找到所搜索的字符串,则返回NULL。
可以采用BF算法和KMP算法,时间复杂度分别为O(M*N)和O(M+N).
代码实现:
问题1代码:
//方法2 #include <iostream> using namespace std; typedef struct ListNode { struct ListNode *next; int data; }ListNode; void InitList(ListNode **head); int FindListLength(ListNode *head); void InitArray(ListNode **tmpArray,ListNode *head); void PrintList(ListNode *head); void QuickSort(ListNode **a,int low,int high); int main(void) { ListNode *head; InitList(&head); cout << "排序前:"; PrintList(head); int listLen = FindListLength(head); ListNode **tmpArray = new ListNode *[listLen]; InitArray(tmpArray,head); QuickSort(tmpArray,0,listLen-1); cout << "排序后:"; for(int i = 0;i<listLen;i++) cout << tmpArray[i]->data << "->"; cout << "NULL" << endl; return 0; } void PrintList(ListNode *head) { while(head) { cout << head->data << "->"; head = head->next; } cout << "NULL" << endl; } void InitArray(ListNode **tmpArray,ListNode *head) { int i = 0; while(head) { tmpArray[i] = head; head = head->next; i++; } } int FindListLength(ListNode *head) { int len = 0; while(head) { len++; head = head->next; } return len; } //111-->22-->3-->NULL void InitList(ListNode **head) { ListNode *tmp = new ListNode; tmp->data = 111; *head = tmp; tmp = new ListNode; tmp->data = 22; (*head)->next = tmp; ListNode *tmp1 = new ListNode; tmp1->data = 3; tmp1->next = NULL; tmp->next = tmp1; } int FindPos(ListNode **a,int low,int high); void QuickSort(ListNode **a,int low,int high) { int pos; if(low<high) { pos = FindPos(a,low,high); QuickSort(a,low,pos-1); QuickSort(a,pos+1,high); } } int FindPos(ListNode **a,int low,int high) { ListNode *val = a[low]; while(low<high) { while( (low<high) && (a[high]->data >= val->data) ) high--; a[low] = a[high]; while( (low<high) && (a[low]->data <= val->data) ) low++; a[high] = a[low]; } a[low] = val; return low; }
问题2代码:
#include <stdio.h> int FindPos(int *a,int low,int high); void QuickSort(int *a,int low,int high); int main(void) { int a[6] = {5,2,19,4,12,45}; int i; QuickSort(a,0,5); for(i=0;i<6;i++) printf("%d ",a[i]); printf("\n"); return 0; } void QuickSort(int *a,int low,int high) { int pos; if(low<high) { pos = FindPos(a,low,high); QuickSort(a,low,pos-1); QuickSort(a,pos+1,high); } } int FindPos(int *a,int low,int high) { int val = a[low]; while(low<high) { while( (low<high) && (a[high]>=val) ) high--; a[low] = a[high]; while( (low<high) && (a[low] <= val) ) low++; a[high] = a[low]; } a[low] = val; return low; }
问题3代码:
//BF算法 #include <stdio.h> const char *my_strstr(const char *str, const char *sub_str) { if(str==NULL || sub_str==NULL) return NULL; for(int i = 0; str[i] != '\0'; i++) { int tem = i; //tem 保留主串中的起始判断下标位置 int j = 0; while(str[tem++] == sub_str[j++]) { if(sub_str[j] == '\0' ) { return &str[i]; } } } return NULL; } int main() { char *s = "1233345hello" ; char *sub = "345" ; printf( "%s\n", my_strstr(s, sub)); return 0; }
//KMP算法 #include <stdio.h> #include <string.h> void compute_prefix(int *next, char *p); char *kmp_match(char *text, char *p, int *next); int main() { int next[101], n; char *p = "345" ; char *text = "1233345hello" ; compute_prefix(next, p); printf( "%s\n",kmp_match(text, p, next)); return 0; } void compute_prefix(int *next, char *p) { int i, n, k; n = strlen(p); next[1] = next[0] = 0; k = 0; /* 第i 次迭代开始之前, k表示next[i-1] 的值*/ for (i = 2; i <= n; i++) { if (p[k] == p[i-1]) k++; else k = 0; next[i] = k; } } char *kmp_match(char *text, char *p, int *next) { int m, n, s, q,num=0; m = strlen(p); n = strlen(text); q = s = 0; /* q表示上一次迭代匹配了多少个字符, s 表示这次迭代从 text的哪个字符开始比较*/ while (s < n) { for (q = next[q]; q < m && p[q] == text[s]; q++, s++); if (q == 0) s++; else if (q == m) { return text+s-m; } } return NULL; }
很多时候不是我们做不好,而是没有竭尽全力......
posted on 2014-11-24 16:15 tractorman 阅读(1165) 评论(4) 编辑 收藏 举报