zoukankan      html  css  js  c++  java
  • 1、基础算法题

    1.递归反向输出字符串

    #include<iostream>
    using namespace std;
    
    void inverse(char*p){  //*p = 'http' ; 
        
        /*
        算法原理:
        将‘http’拆分成‘h’‘t’‘t’‘p’判断是否为空字符,不为空则继续递归进行比较,
        比较完之后在通过
        inverse(p + 1);
        printf("%c", *p);
        逐个进行打印
        
        */
        if (*p == '')  //表示字符型指针p所指向的变量值不为空字符
        { 
            return;
        }
        inverse(p + 1);
        printf("%c", *p);
    }
    
    int main(){
    
        inverse("http");
        system("pause");
        return 0;
    }

    2、用递归算法判断数组a[n]是否为一个递增数组

    方法:记录当前最大的,并且判断当前的是否比这个还大,大则继续,否则返回false结束

    #include<iostream>
    using namespace std;
    
    /*
        思路:
        a为数组,n为数组中数字的个数
        当数组的个数大于3个时
        首先执行
        return fun(a, n - 1) && a[n - 1] > a[n - 2];
        判断数组是否递增
        若递增则继续进行递归,直到n=2和n=1时开始执行上面的两个if语句
    */
    bool fun(int* a, int n)
    {
        if (n == 1){
            return true;
        }
        if (n == 2){
            return a[n - 1] >= a[n - 2];
        }
        return fun(a, n - 1) && a[n - 1] > a[n - 2];
    }
    
    
    int main()
    {
        int a[] = { 1, 2, 3, 8, 5 };
        int n = 5;
        if (fun(a, 5) == true)
        {
            printf("True");
        }
        else{
            printf("False");
        }
        
        system("pause");
        return 0;
    
    }

    3、实现strcmp

    什么是Strcmp?

    设这两个字符串为str1,str2,
    若str1=str2,则返回零;
    若str1<str2,则返回负数;
    若str1>str2,则返回正数。
    #include<iostream>
    using namespace std;
    /*
        思路:
        整个函数的原型中得益于“(*str1!='')&&(*str1==*str2)”这一句的代码,
        因为这样当字符指针指向空,意味着字符串已经移动到最后了,比较结束,
        此时可以退出循环。而如果两个字符串不相等时,则此时函数也可以退出了。
    */
    void strmp(const char* str1, const char* str2)
    {
        while ((*str1 != '')&&(*str1 == *str2)) 
        {
            str1++;    /*字符右移*/
            str2++;
        }
        if ((*str1 - *str2) > 0){
            printf("str1>str2");
        }
        if ((*str1 - *str2) == 0){
            printf("str1=str2");
        }
        if ((*str1 - *str2) < 0){
            printf("str1<str2");
        }        
    }
    int main()
    {
        strmp("https","htts");
        system("pause");
        return 0;
    
    }

    4、实现子串定位

    方法一:

    /*
        思路:
            1、判断字符串是否为空
            2、然后将T和S的字符逐渐进行比较
            3、不匹配时,执行
            i = i - j + 1;
            j = 0;
            4、最终通过return j == Slength ? i - Slength : -1;得到结果
    */
    int findstr(char T[],char S[],int Tlength,int Slength)
    {
        if (T == NULL&&S == NULL)
        {
            return -1;
        }
        int j = 0;
        int i = 0;
        while (i < Tlength&&j < Slength)
        {
            if (T[i] == S[j])
            {
                i++;
                j++;
            }
            else{
                i = i - j + 1;
                j = 0;
            }
        }
        return j == Slength ? i - Slength : -1;
    }
    

    方法二:

    int findSubStr(const char* MainStr,const char* SubStr)
    {
        const char* p;
        const char* q;
        const char* u = MainStr;
        if(MainStr == NULL || SubStr == NULL)
        {
            return -1;
        }
        while(*MainStr)
        {
            p = MainStr;
            q = SubStr;
            //找到子串的位置,当*p!=*q时循环跳出
            while(*p && *q && *p++ == *q++)
            if(!*q)
            {
                return MainStr-u+1;
            }
            MainStr++;
        }
        return -1;
    }

    复杂度最低。运算最快的方法:

    KMP算法,该算法会在本栏里讲解

  • 相关阅读:
    LeetCode#13罗马数字转整数
    LeetCode#7整数反转
    LeetCode#1两数之和
    LeetCode#26删除排序数组中的重复项
    LeecCode#1550存在连续三个奇数的数组
    LeetCode#228汇总区间
    LeetCode#1476子矩形查询
    LeetCode#1535找出数组游戏的赢家
    LeetCode#867转置矩阵
    Vue源码——摸着石头过河
  • 原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/10639127.html
Copyright © 2011-2022 走看看