栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

leetcode之字符串---C语言

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetcode之字符串---C语言

  1. 第一题

    基本思路一:只需要遍历字符串二分之一大小,先让第一个字符更新为第一个字符+最后一个字符,最后一个字符等于第一个字符减去最后一个字符,这样就把第一个字符的位置更新为第一个字符,以此内推,第一个字符等于本身减去最后一个字符。
    容易报错的情况
    (1)heap-buffer-overflow,对地址的非法访问。
    (2)AddressSanitizer:DEADLYSIGNAL详细分析与解决,高频越界,数组引用超越了左右边界;无限递归,代码无法正常结束返回;高频函数入参及出参返回处理错误。

    void reverseString(char* a, int sSize){
       int i;
       
       for(i=0;i 

    基本思路二:设定头尾指针,当头指针小于尾指针时,不停交换。

    void swap(char *left,char *right)
    {
        char temp;
    
        temp=*left;
        *left=*right;
        *right=temp;
    }
    void reverseString(char* s, int sSize){
        int front=0,rear=sSize-1;
    
        while(front 
  2. 第二题

基本思路:上一题基本思路二+判断是否为元音。

	bool isVowel(char ch) {
	    char* vowel = "AEIOUaeiou";
	    int vSize = strlen(vowel);
	    for (int i = 0;i < vSize;i++) {
	        if (ch == vowel[i]) {
	            return true;
	        }
	    }
	    return false;
	}
	void swap(char* left, char* right) {
	    char tmp = *left;
	    *left = *right;
	    *right = tmp;
	}
	char * reverseVowels(char * s){
	    int sSize = strlen(s);
	    int front = 0, rear = sSize-1;
	    while (front < rear) {
	        if (isVowel(s[front]) == false) {
	            front++;
	        }    
	        if (isVowel(s[rear]) == false) {
	            rear--;
	        } 
	        if (isVowel(s[front]) && isVowel(s[rear])) {
	            swap(s+front, s+rear);
	            front++;
	            rear--;
	        }
	    }
	    return s;
	}
  1. 第三题

    基本思路:设定一个标识符,如果magazine中有ransomNote中一样的字符,则加一,每次相等比较后需要改变magazine该位置的字符为非法字符(因为本题要求了字符串是小写字符,所以设定非法字符为该字母的大写状态),最后比较标识符是否等于ransomNote字符串的大小,如果等于说明能找到,否则不能。
bool canConstruct(char * ransomNote, char * magazine){
    int i,j;
    int l1=strlen(ransomNote);  //串一长度
    int l2=strlen(magazine);   //串二长度
    int sum=0;  //最后sum为零说明

    for(i=0;i 
  1. 第四题

基本思路:

做法一:两个for循环嵌套,这样造成的时间复杂度是O(n^2),在leetcode上通过不了,超过时间复杂度了(隐形条件,leetcode很多都无法通过)。

int firstUniqChar(char * s){

    int index=0 ,flag=-1;  //返回的索引,如果该值不更新,说明没有找到
    int length=strlen(s); //字符串长度
    int i,j;  

    for(i=0;i 

}

做法二:

  1. 第五题

暴力解法。

	int numJewelsInStones(char * jewels, char * stones){
	    int lj=strlen(jewels);
	    int ls=strlen(stones);
	    int index=0;
	    int i,j;
	
	    for(i=0;i 
  1. 第六题

基本思路:修改字符串reverse函数,不界定首尾,因为此题需要reverse的字符串的首尾是变动的,然后字符串需要reverse的部分是2k之后,i的递增力度是2k,注意辨别该字符串剩下的字符串个数是否少于k个,如果不足k个需要全部反转,否则只反转前k个。

	void swap(char* left,char* right)
	{
	    char temp=*left;
	    *left=*right;
	    *right=temp;
	}
	void reverse(char* front,char* rear){
	    while(front 
  1. 第七题

基本思路:s不包含任何开头或结尾空格,每个单词之间都会用空格隔开,第一种我们可以原地修改,字符串reverse的方法和前面一致,我们只需要判断空格的位置,来确定单词的起始位置。

	void swap(char* a,char* b)
	{
	    char temp;
	    temp=*a;
	    *a=*b;
	    *b=temp;
	}
	void reverse(char* l ,char *r)
	{
	    while(l
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/847426.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号