leecode-C语言实现-28. 找出字符串中第一个匹配项的下标

news2024/11/25 19:37:49

一、题目

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1

示例 1:

输入:haystack = "sadbutsad", needle = "sad"

输出:0

解释:"sad" 在下标 0 和 6 处匹配。

第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"

输出:-1

解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

提示:

  • 1 <= haystack.length, needle.length <= 10**4

  • haystack 和 needle 仅由小写英文字符组成

二、解题思路

这里可以用两种方法进行解题,一种是BF算法(暴力搜索算法),算法时间复杂度为O(n*m),另一种是KMP算法(BF算法改进),算法时间复杂度为O(n+m)。这里我们用KMP算法进行解题,最好结合着《三、函数介绍》来看。

在进行字符串匹配之前,我们需要算出模式串的前缀表,也就是算出模式串从第一个字符到倒数第二字符的最长公共前后缀。如下图:

我们可以根据第一个A来推导AB,再来推导ABA的最长公共前后缀,推导方法为:

  1. A只有一个,最长公共前后缀:0。

  1. AB,新增字符B,A和B不相等,最长公共前后缀:0。

  1. ABA,新增字符A,A和A相等,最长公共前后缀:1。

  1. ABAB,新增字符B,B和B(上一个最长公共前后缀:1为索引位的值为B)相等,最长公共前后缀:2。

  1. ABABC,新增字符C,C和A(上一个最长公共前后缀:2为索引位的值为A)不相等,这时需要计算前两位AB和后两位BC是否相等,不相等,最长公共前后缀:0。

  1. ABABCA,新增字符A,A和A(上一个最长公共前后缀:0,所以直接和头部的A比较)相等,最长公共前后缀:1。

  1. ABABCAB,新增字符B,B和B(上一个最长公共前后缀:1为索引位的值为B)相等,最长公共前后缀加一变为:2。

  1. ABABCABA,新增字符A,A和A(上一个最长公共前后缀:2为索引位的值为A)相等,最长公共前后缀加一变为:3。

再在前缀表的前面加-1主要是为了方便计算,就到了最终版前缀表。

前缀表PrefixTable,主串索引PrimaryStrIndex,模式串索引SubStrIndex,从0开始匹配,当匹配到4号索引位时和主串字符不同,SubStrIndex由4变为PrefixTable[4]也就是2,模式串的2号索引位为A,相等和主串索引4号位A,继续匹配。

当匹配到PrimaryStrIndex=6,SubStrIndex=4时,又不想等,将SubStrIndex置为PrefixTable[4]也就是2,模式串的2号索引位为A,相等和主串索引6号位A,继续匹配,发现全部匹配上,就OK了。

三、函数介绍

1、GetPrefixTable

(1)用途

给出字符串StrArray及其长度StrArrayLen,返回一个int类型的前缀表数组。

(2)源码

int* GetPrefixTable(char* StrArray, size_t StrArrayLen)
{
    int* PrefixTable        = (int*)malloc(sizeof(int) * StrArrayLen);
    PrefixTable[0]          = -1;
    if(StrArrayLen == 1)
    {
        return PrefixTable;
    }
    PrefixTable[1]          = 0;
    size_t StrArrayIndex    = 1;
    size_t PrefixTableIndex;
    size_t i = 0;
    for(PrefixTableIndex = 2; PrefixTableIndex<StrArrayLen; PrefixTableIndex++,StrArrayIndex++)
    {
       //printf("PrefixTableIndex : %ld, StrArrayIndex : %ld, PrefixTable[PrefixTableIndex-1] : %d\n",PrefixTableIndex,StrArrayIndex,PrefixTable[PrefixTableIndex-1]);
       if(PrefixTable[PrefixTableIndex-1] == 0) //如果前缀表的上一位的值为0,说明没有公共前后缀。
       {
           //printf("StrArray[0] : %c, StrArray[StrArrayIndex] : %c\n",StrArray[0], StrArray[StrArrayIndex]);
           if(StrArray[0] == StrArray[StrArrayIndex]) //判断第一个字符和新子串最后一位是否相等。
           {
               PrefixTable[PrefixTableIndex] = 1;
           }
           else
           {
               PrefixTable[PrefixTableIndex] = 0;
           }
       }
       else
       {
           //printf("StrArray[PrefixTable[PrefixTableIndex-1]] : %c, StrArray[StrArrayIndex] : %c\n",StrArray[PrefixTable[PrefixTableIndex-1]],StrArray[StrArrayIndex]);
           if(StrArray[PrefixTable[PrefixTableIndex-1]] == StrArray[StrArrayIndex])//判断上一个公共前缀最大长度的后一位和新子串最后一位是否相等。
           {
                PrefixTable[PrefixTableIndex] =  PrefixTable[PrefixTableIndex-1] + 1;
           }
           else
           {
                for(i=0; i<PrefixTable[PrefixTableIndex-1]; i++)//需要循环判断上一个公共前缀的每个字符和新子串的相应字符是否相等。如果上一个公共前缀最大长度是2,字符串aacaaa,那就需要判断前两个a和后两个a是否相等。
                {
                    if(StrArray[i] != StrArray[StrArrayIndex-PrefixTable[PrefixTableIndex-1]+1+i])
                    {
                        PrefixTable[PrefixTableIndex] = 0;
                        break;
                    }
                }
                if(i == PrefixTable[PrefixTableIndex-1])
                {
                    PrefixTable[PrefixTableIndex] =  PrefixTable[PrefixTableIndex-1];
                }
           }
       }
       //printf("PrefixTable[%ld] = %d\n",PrefixTableIndex,PrefixTable[PrefixTableIndex]);
       //printf("=====================\n");
    }
    return PrefixTable;
}

(3)参数

参数名

描述

StrArray

char*类型StrArray字符串。

StrArrayLen

size_t类型的StrArray长度。

2、KmpSearch

(1)用途

在主串PrimaryStr搜索第Times次出现的模式串SubStr,返回SubStr的首字符在PrimaryStr的索引位。如果匹配失败返回-1。

(2)源码

int KmpSearch(char* PrimaryStr, char* SubStr, int Times)
{
    if(PrimaryStr == NULL || SubStr == NULL)
    {
        return -1;
    }
    if(Times < 1)
    {
        return -1;
    }
    size_t      PrimaryStrLen = strlen(PrimaryStr);
    size_t      SubStrLen     = strlen(SubStr);
    if(SubStrLen > PrimaryStrLen)
    {
        return -1;
    }
    else if(SubStrLen == PrimaryStrLen)
    {
        if(strcmp(SubStr,PrimaryStr) == 0)
        {
            return 0;
        }
        else
        {
            return -1;
        }
    }
    long long PrimaryStrIndex = 0;
    long long SubStrIndex     = 0;
    int Cnt                   = 0;//匹配次数和Times对应。 
    int* PrefixTable          = GetPrefixTable(SubStr, SubStrLen);

    PrintArray(PrimaryStr, PrimaryStrLen, sizeof(char));
    PrintArray(SubStr, SubStrLen, sizeof(char));
    PrintArray(PrefixTable, SubStrLen, sizeof(int));

    while(PrimaryStrIndex < PrimaryStrLen)
    {
        if(PrimaryStr[PrimaryStrIndex] == SubStr[SubStrIndex])
        {
            PrimaryStrIndex++;
            SubStrIndex++;
            if(SubStrIndex == SubStrLen)
            {
                Cnt++;
                if(Cnt == Times)
                {
                    return PrimaryStrIndex - SubStrIndex;
                }
                SubStrIndex--;
                SubStrIndex = PrefixTable[SubStrIndex];
                
            }
        }
        else
        {
            SubStrIndex = PrefixTable[SubStrIndex];
            if(SubStrIndex == -1)
            {
                PrimaryStrIndex++;
                SubStrIndex++;
            }
        }
    }

    free(PrefixTable);
    return -1;
}

(3)参数

参数名

描述

PrimaryStr

char*类型主串。

SubStr

char*类型模式串。

Times

匹配第几次

四、虚机测试源码

# include<stdio.h>
# include<string.h>
# include<stdlib.h>

int* GetPrefixTable(char* StrArray, size_t StrArrayLen);
int KmpSearch(char* PrimaryStr, char* SubStr, int Times);
void PrintArray(void* Array, size_t ArrayLen, size_t TypeFlag);

int main()
{
    char* PrimaryStr = "ABABABABCABAAB";
    char* SubStr     = "ABABCABAA";
    printf("Position : %d\n",KmpSearch(PrimaryStr, SubStr, 1));
    return 0;
}

int* GetPrefixTable(char* StrArray, size_t StrArrayLen)
{
    int* PrefixTable        = (int*)malloc(sizeof(int) * StrArrayLen);
    PrefixTable[0]          = -1;
    if(StrArrayLen == 1)
    {
        return PrefixTable;
    }
    PrefixTable[1]          = 0;
    size_t StrArrayIndex    = 1;
    size_t PrefixTableIndex;
    size_t i = 0;
    for(PrefixTableIndex = 2; PrefixTableIndex<StrArrayLen; PrefixTableIndex++,StrArrayIndex++)
    {
       //printf("PrefixTableIndex : %ld, StrArrayIndex : %ld, PrefixTable[PrefixTableIndex-1] : %d\n",PrefixTableIndex,StrArrayIndex,PrefixTable[PrefixTableIndex-1]);
       if(PrefixTable[PrefixTableIndex-1] == 0) //如果前缀表的上一位的值为0,说明没有公共前后缀。
       {
           //printf("StrArray[0] : %c, StrArray[StrArrayIndex] : %c\n",StrArray[0], StrArray[StrArrayIndex]);
           if(StrArray[0] == StrArray[StrArrayIndex]) //判断第一个字符和新子串最后一位是否相等。
           {
               PrefixTable[PrefixTableIndex] = 1;
           }
           else
           {
               PrefixTable[PrefixTableIndex] = 0;
           }
       }
       else
       {
           //printf("StrArray[PrefixTable[PrefixTableIndex-1]] : %c, StrArray[StrArrayIndex] : %c\n",StrArray[PrefixTable[PrefixTableIndex-1]],StrArray[StrArrayIndex]);
           if(StrArray[PrefixTable[PrefixTableIndex-1]] == StrArray[StrArrayIndex])//判断上一个公共前缀最大长度的后一位和新子串最后一位是否相等。
           {
                PrefixTable[PrefixTableIndex] =  PrefixTable[PrefixTableIndex-1] + 1;
           }
           else
           {
                for(i=0; i<PrefixTable[PrefixTableIndex-1]; i++)//需要循环判断上一个公共前缀的每个字符和新子串的相应字符是否相等。如果上一个公共前缀最大长度是2,字符串aacaaa,那就需要判断前两个a和后两个a是否相等。
                {
                    if(StrArray[i] != StrArray[StrArrayIndex-PrefixTable[PrefixTableIndex-1]+1+i])
                    {
                        PrefixTable[PrefixTableIndex] = 0;
                        break;
                    }
                }
                if(i == PrefixTable[PrefixTableIndex-1])
                {
                    PrefixTable[PrefixTableIndex] =  PrefixTable[PrefixTableIndex-1];
                }
           }
       }
       //printf("PrefixTable[%ld] = %d\n",PrefixTableIndex,PrefixTable[PrefixTableIndex]);
       //printf("=====================\n");
    }
    return PrefixTable;
}

int KmpSearch(char* PrimaryStr, char* SubStr, int Times)
{
    if(PrimaryStr == NULL || SubStr == NULL)
    {
        return -1;
    }
    size_t      PrimaryStrLen = strlen(PrimaryStr);
    size_t      SubStrLen     = strlen(SubStr);
    if(SubStrLen > PrimaryStrLen)
    {
        return -1;
    }
    else if(SubStrLen == PrimaryStrLen)
    {
        if(strcmp(SubStr,PrimaryStr) == 0)
        {
            return 0;
        }
        else
        {
            return -1;
        }
    }
    long long PrimaryStrIndex = 0;
    long long SubStrIndex     = 0;
    int Cnt                   = 0;//匹配次数和Times对应。 
    int* PrefixTable          = GetPrefixTable(SubStr, SubStrLen);

    PrintArray(PrimaryStr, PrimaryStrLen, sizeof(char));
    PrintArray(SubStr, SubStrLen, sizeof(char));
    PrintArray(PrefixTable, SubStrLen, sizeof(int));

    while(PrimaryStrIndex < PrimaryStrLen)
    {
        if(PrimaryStr[PrimaryStrIndex] == SubStr[SubStrIndex])
        {
            PrimaryStrIndex++;
            SubStrIndex++;
            if(SubStrIndex == SubStrLen)
            {
                Cnt++;
                if(Cnt == Times)
                {
                    return PrimaryStrIndex - SubStrIndex;
                }
                SubStrIndex--;
                SubStrIndex = PrefixTable[SubStrIndex];
                
            }
        }
        else
        {
            SubStrIndex = PrefixTable[SubStrIndex];
            if(SubStrIndex == -1)
            {
                PrimaryStrIndex++;
                SubStrIndex++;
            }
        }
    }

    free(PrefixTable);
    return -1;
}

void PrintArray(void* Array, size_t ArrayLen, size_t TypeFlag)
{
    size_t i;
    printf("Array    : ");
    for(i = 0; i < ArrayLen; i++)
    {
        switch(TypeFlag)
        {
            case sizeof(int)  : printf("%d ",((int*)Array)[i]); break;
            case sizeof(char) : printf("%c ",((char*)Array)[i]); break;
            default : printf("Unknow Type!!!\n" );
        }
    }
    printf("\n==================================\n");
}

五、虚机测试

[gbase@czg2 LinearTable_String_KMP]$ make
gcc -Wall -g KmpSearch.c -o Test_KmpSearch 

[gbase@czg2 LinearTable_String_KMP]$ ./Test_KmpSearch 
Array    : A B A B A B A B C A B A A B 
==================================
Array    : A B A B C A B A A 
==================================
Array    : -1 0 0 1 2 0 1 2 3 
==================================
Position : 4

六、Leecode提交源码

int* GetPrefixTable(char* StrArray, size_t StrArrayLen);
int KmpSearch(char* PrimaryStr, char* SubStr, int Times);

int strStr(char * haystack, char * needle){
    return KmpSearch(haystack, needle, 1);
}

int* GetPrefixTable(char* StrArray, size_t StrArrayLen)
{
    int* PrefixTable        = (int*)malloc(sizeof(int) * StrArrayLen);
    PrefixTable[0]          = -1;
    if(StrArrayLen == 1)
    {
        return PrefixTable;
    }
    PrefixTable[1]          = 0;
    size_t StrArrayIndex    = 1;
    size_t PrefixTableIndex;
    int i = 0;
    for(PrefixTableIndex = 2; PrefixTableIndex<StrArrayLen; PrefixTableIndex++,StrArrayIndex++)
    {
       //printf("PrefixTableIndex : %ld, StrArrayIndex : %ld, PrefixTable[PrefixTableIndex-1] : %d\n",PrefixTableIndex,StrArrayIndex,PrefixTable[PrefixTableIndex-1]);
       if(PrefixTable[PrefixTableIndex-1] == 0) //如果前缀表的上一位的值为0,说明没有公共前后缀。
       {
           //printf("StrArray[0] : %c, StrArray[StrArrayIndex] : %c\n",StrArray[0], StrArray[StrArrayIndex]);
           if(StrArray[0] == StrArray[StrArrayIndex]) //判断第一个字符和新子串最后一位是否相等。
           {
               PrefixTable[PrefixTableIndex] = 1;
           }
           else
           {
               PrefixTable[PrefixTableIndex] = 0;
           }
       }
       else
       {
           //printf("StrArray[PrefixTable[PrefixTableIndex-1]] : %c, StrArray[StrArrayIndex] : %c\n",StrArray[PrefixTable[PrefixTableIndex-1]],StrArray[StrArrayIndex]);
           if(StrArray[PrefixTable[PrefixTableIndex-1]] == StrArray[StrArrayIndex])//判断上一个公共前缀最大长度的后一位和新子串最后一位是否相等。
           {
                PrefixTable[PrefixTableIndex] =  PrefixTable[PrefixTableIndex-1] + 1;
           }
           else
           {
                for(i=0; i<PrefixTable[PrefixTableIndex-1]; i++)
                {
                    if(StrArray[i] != StrArray[StrArrayIndex-PrefixTable[PrefixTableIndex-1]+1+i])
                    {
                        PrefixTable[PrefixTableIndex] = 0;
                        break;
                    }
                }
                if(i == PrefixTable[PrefixTableIndex-1])
                {
                    PrefixTable[PrefixTableIndex] =  PrefixTable[PrefixTableIndex-1];
                }
           }
       }
       //printf("PrefixTable[%ld] = %d\n",PrefixTableIndex,PrefixTable[PrefixTableIndex]);
       //printf("=====================\n");
    }
    return PrefixTable;
}

int KmpSearch(char* PrimaryStr, char* SubStr, int Times)
{
    if(PrimaryStr == NULL || SubStr == NULL)
    {
        return -1;
    }
    size_t      PrimaryStrLen = strlen(PrimaryStr);
    size_t      SubStrLen     = strlen(SubStr);
    if(SubStrLen > PrimaryStrLen)
    {
        return -1;
    }
    else if(SubStrLen == PrimaryStrLen)
    {
        if(strcmp(SubStr,PrimaryStr) == 0)
        {
            return 0;
        }
        else
        {
            return -1;
        }
    }
    long long PrimaryStrIndex = 0;
    long long SubStrIndex     = 0;
    int Cnt                   = 0;//匹配次数和Times对应。 
    int* PrefixTable          = GetPrefixTable(SubStr, SubStrLen);

    //PrintArray(PrimaryStr, PrimaryStrLen, sizeof(char));
    //PrintArray(SubStr, SubStrLen, sizeof(char));
    //PrintArray(PrefixTable, SubStrLen, sizeof(int));

    while(PrimaryStrIndex < PrimaryStrLen)
    {
        if(PrimaryStr[PrimaryStrIndex] == SubStr[SubStrIndex])
        {
            PrimaryStrIndex++;
            SubStrIndex++;
            if(SubStrIndex == SubStrLen)
            {
                Cnt++;
                if(Cnt == Times)
                {
                    return PrimaryStrIndex - SubStrIndex;
                }
                SubStrIndex--;
                SubStrIndex = PrefixTable[SubStrIndex];
                
            }
        }
        else
        {
            SubStrIndex = PrefixTable[SubStrIndex];
            if(SubStrIndex == -1)
            {
                PrimaryStrIndex++;
                SubStrIndex++;
            }
        }
    }

    free(PrefixTable);
    return -1;
}

void PrintArray(void* Array, size_t ArrayLen, size_t TypeFlag)
{
    size_t i;
    printf("Array    : ");
    for(i = 0; i < ArrayLen; i++)
    {
        switch(TypeFlag)
        {
            case sizeof(int)  : printf("%d ",((int*)Array)[i]); break;
            case sizeof(char) : printf("%c ",((char*)Array)[i]); break;
            default : printf("Unknow Type!!!\n" );
        }
    }
    printf("\n==================================\n");
}

七、Leecode通过截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/377622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flutter 微信聊天输入框

高仿微信聊天输入框&#xff0c;效果图如下&#xff08;目前都是静态展示&#xff0c;服务还没开始开发&#xff09;&#xff1a; 大家如果观察仔细的话 应该会发现&#xff0c;他输入框下面的高度 刚好就是 软键盘的高度&#xff1b;所以在这里就需要监听软键盘的高度。还要配…

zigbee与WIFI同频干扰问题

zigbee与WIFI同频干扰 为了降低Wifi信道与Zigbee信道的同频干扰问题&#xff0c;Zigbee联盟在《Zigbee Home Automation Public Application Profile》中推荐使用11,14,15,19,20,24,25这七个信道。 为什么呢&#xff0c;我们看一下Wifi和Zigbee的信道分布。 WiFi带宽对干扰的…

社交媒体营销的5个好处

有些人认为&#xff0c;社交媒体营销不能直接与销售挂钩。这就是为什么在制定营销策略时&#xff0c;社交媒体营销会被部分人忽视的原因。然而&#xff0c;与其他广告渠道不同&#xff0c;社交媒体是双向渠道。忽视社交媒体营销将影响与客户的关系。最重要的是&#xff0c;它将…

兔c同学:python 如何写入文件(python 的文件和异常)

文章目录1. 写入文件1.1 写入空文件1.2 open() 函数 和 write() 函数说明open() 函数的参数说明write() 函数1.3 附加到文件1. 写入文件 保存数据的最简单方式之一是将其写入到文件中。通过将输出写入文件&#xff0c;即便关闭包含输出的终端窗口&#xff0c;这些输出也依然存在…

五年携手共话,FISCO BCOS为数实相生注入新动能

2月24日&#xff0c;作为深圳国际金融科技节系列活动之一&#xff0c;由深圳市地方金融监督管理局指导&#xff0c;微众银行、金链盟主办的“2022产业区块链年度峰会暨FISCO BCOS五周年生态大会”&#xff08;下称“大会”&#xff09;在深圳顺利召开。本次大会以“数实相生&am…

驱动程序开发:Buildroot根文件系统构建并加载驱动文件xxx.ko测试

目录一、buildroot根文件系统简介二、buildroot下载三、buildroot构建根文件系统1、配置 buildroot①配置 Target options②配置 Toolchain③配置 System configuration④配置 Filesystem images⑤禁止编译 Linux 内核和 uboot2、 buildroot 下的 busybox 配置①修改 Makefile&…

hive支持的数据类型

目录 一、hive数据类型 1.基础型 2.复杂型 二、类型转换 1.隐式转换 2.显示转换 一、hive数据类型 1.基础型 数据类型长度大小示例TINYINT1字节有符号整数&#xff0c;范围&#xff1a;-128~12710YSMALLINT2字节有符号整数&#xff0c;范围&#xff1a;-32768~3276710SI…

【解锁技能】学会Python条件语句的终极指南!

文章目录前言一. python条件语句的介绍1.1 什么是条件语句1.2 条件语句的语法1.3 关于内置函数bool()二. 分支语句之单分支三. 多分支语句3.1 二分支语句3.2 多分支语句3.3 嵌套循环总结前言 &#x1f3e0;个人主页&#xff1a;欢迎访问 沐风晓月的博客 &#x1f9d1;个人简介&…

Softing OPC Tunnel——绕过DCOM配置实现OPC Classic广域网通信

一 摘要 Softing OPC Tunnel是dataFEED OPC Suite的一个组件&#xff0c;可避免跨设备OPC Classic通信中出现的DCOM配置问题&#xff0c;同时可保证跨网络数据交换的高性能和可靠性。OPC Tunnel内部集成的存储转发功能&#xff0c;可在连接中断时缓存数据&#xff0c;并在重新…

html的常见标签使用

目录 1.vscode基础操作 2.html基础 语法 3.HTML文件的基本结构标签 4.注释标签 5.标题标签 6.段落标签:p 7.格式化标签 8.图片标签:img 绝对路径 相对路径 网络路径 alt属性 title属性 width/height属性 9.超链接标签:a 10.表格标签 11.列表标签 有序列表 无…

Hbase -- Compact工具梳理

1. 背景 当前&#xff0c;线上HBase集群的自动Major Compact是关闭的&#xff0c;我们选择在凌晨业务空闲的时候进行手动触发Major Compact&#xff0c;Compact工具就是在运维平台上对资源组、RS、表进行Major Compact。目前线上有2种版本的Compact程序&#xff1a;Compact_v1…

html 懒加载图片实现方法

懒加载逻辑 一般如果场景比较大&#xff0c;滚动条很长&#xff0c;图片比较多的情况下&#xff0c;不使用赖加载图片会一下子把资源都加载&#xff0c;导致性能很慢&#xff0c;甚至没有滚动到下面也加载了&#xff0c;很浪费资源现在通过滚动事件来处理图片加载,我们先吧要显…

Vue项目中components组件的使用笔记

目录 前言 一、components和component的区别&#xff1f; 二、components使用的步骤 1.创建组件vue文件 2.引入组件 3.注册组件 4.应用组件 总结 前言 本文章&#xff0c;只是初步了解记录components的使用步骤。 一、components和component的区别&#xff1f; compo…

【Python学习笔记】第二十一节 Python Lambda 函数

Python 提供了非常多的库和内置函数。有不同的方法可以执行相同的任务&#xff0c;而在 Python 中&#xff0c;有个万能之王函数&#xff1a;lambda 函数&#xff0c;它以不同的方式在任何地方使用。一、Lambda 函数简介在 Python 中&#xff0c;函数可以接受一个或多个位置参数…

火爆全网的ChatGPT 和AI 可以为项目经理做什么?

作为一款人工智能聊天机器人&#xff0c;ChatGPT因其逼真和人性化的特性而风靡全球&#xff0c;无疑是当今技术的新流行。人工智能 (AI) 有可能彻底改变许多行业&#xff0c;包括项目管理&#xff0c;及时了解最新技术以及它如何影响你的工作至关重要。于是&#xff0c;我们与C…

C++ string类(二)及深浅拷贝

一、string类方法使用举例1.迭代器迭代器本质&#xff1a;指针&#xff08;理解&#xff09;迭代器&#xff1a;正向迭代器&#xff1a; begin() | end() 反向迭代器&#xff1a; rbegin() | rend()2.find使用//找到s中某个字符 void TestString3() {string s("AAADEFNUIE…

分层测试(1)分层测试是什么?【必备】

1. 什么是分层测试&#xff1f; 分层测试是通过对质量问题分类、分层来保证整体系统质量的测试体系。 模块内通过接口测试保证模块质量&#xff0c;多模块之间通过集成测试保证通信路径和模块间交互质量&#xff0c;整体系统通过端到端用例对核心业务场景进行验证&#xff0c…

Spring Boot 3.0系列【2】部署篇之使用GraalVM构建原生镜像

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot版本2.7.0 文章目录概述JIT & AOTJIT &#xff08;动态编译&#xff09;AOT&#xff08;静态编译&#xff09;GraalVM简介运行模式Native Image&#xff08;原生镜像&#xff09;…

无线蓝牙耳机哪个牌子性价比高?国内性价比高的蓝牙耳机推荐

近年来&#xff0c;蓝牙耳机越来越成为人们日常生活中常见的数码产品之一&#xff0c;其便捷性以及愈发先进的功能得到了不少消费者的认可。无线蓝牙耳机哪个牌子性价比高&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款国内性价比高的蓝牙耳机&#xff0c;一起来看看…

AI画图_stable-diffusion-webui安装使用指南(1)

本文章适用于: 有一定学习能力和钻研能力&#xff0c;遇到问题能合理使用搜索引擎尝试解决问题的人想在windows系统中尝试使用AI作画工具stable-diffusion-webui进行绘画的人有一定的计算机基础&#xff08;会魔法上网、知道 python和Git&#xff09;和英文阅读能力的人显卡为…