• 第七十九题合集 【微软面试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("
    ");
        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] != ''; i++)
        {
            int tem = i; //tem 保留主串中的起始判断下标位置
            int j = 0;
            while(str[tem++] == sub_str[j++])
            {
                if(sub_str[j] == '' )
                {
                    return &str[i];
                }
            }
        }
    
        return NULL;
    }
    
    int main()
    {
        char *s = "1233345hello" ;
        char *sub = "345" ;
        printf( "%s
    ", 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
    ",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;
    }
  • 相关阅读:
    PHP | 运算符优先级
    Docker配置PHP+Nginx+MySQL
    Windows下Mysql主从配置
    php-fpm重启配置修改无效
    MySQL事务
    hadoop伪集群搭建
    Springboot2.x源码下载安装
    微服务——服务之间访问,用Feign请求服务接口超时如何解决?
    Lua安装
    日期——计算每月第一天和最后一天
  • 原文地址:https://www.cnblogs.com/tractorman/p/4118942.html
Copyright © 2020-2023  润新知