C++从零开始的打怪升级之路(day10)

发布时间:2024年01月15日

这是关于一个普通双非本科大一学生的C++的学习记录贴

在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料

那么开启正题

为了巩固前面的知识,最近更新刷题贴,C++进度暂缓

1.有效字母异或词

. - 力扣(LeetCode)

由于还没学C++的字符串有些题的ac代码是用C语言写的

给定两个字符串s?和?t?,编写一个函数来判断?t?是否是?s?的字母异位词。

注意:若?s?和?t?中每个字符出现的次数都相同,则称?s?和?t?互为字母异位词

这个题创建一个初始化为0的数组,遍历两个字符串,一个对数组元素进行++,另一个对数组元素进行--,再遍历数组看数组内成员是否都为0即可

bool isAnagram(char* s, char* t) 
{
    int a[200] = {0};
    while(*s != '\0')
    {
        ++a[*s];
        ++s;
    }    
    while(*t != '\0')
    {
        --a[*t];
        ++t;
    }
    int i=0;
    for(i=0;i<200;i++)
    {
        if(a[i])
            return false;
    }

    return true;
}

?这是ac代码

2.判断字符串的两半是否相似

. - 力扣(LeetCode)

给你一个偶数长度的字符串 s 。将其拆分成长度相同的两半,前一半为 a ,后一半为 b 。两个字符串相似的前提是 它们都含有相同数目的元音('a','e','i','o','u','A','E','I','O','U')。注意,s 可能同时含有大写和小写字 母。如果 a 和 b 相似,返回 true ;否则,返回 false 。

首先利用偶数长度字符串找到中间指针,两个指针一起“向前走”根据是否为元音字母对两个数字num1,num2进行++,最后比较两个数字是否相等即可

bool halvesAreAlike(char* s) 
{
    int len = strlen(s);
    char* t = s + (len/2);
    int num1 = 0,num2 = 0;
    while(*t)
    {
        if(*s == 'a' || *s == 'e'||*s == 'i'||*s == 'o'||*s == 'u'||*s == 'A'||*s == 'E'||*s == 'I'||*s == 'O'||*s == 'U')
            ++num1;
        if(*t == 'a' || *t == 'e'||*t == 'i'||*t == 'o'||*t == 'u'||*t == 'A'||*t == 'E'||*t == 'I'||*t == 'O'||*t == 'U')
            ++num2;

        ++t;
        ++s;
    }    

    if(num1 == num2)
        return true;
    else
        return false;
}

??这是ac代码

3.检查两个字符串是否几乎相等

. - 力扣(LeetCode)

如果两个字符串 word1 和 word2 中从 'a' 到 'z' 每一个字母出现频率之差都不超过 3 ,那么我们称这两个字符串 word1 和 word2 几乎相等 。给你两个长度都为 n 的字符串 word1 和 word2 ,如果 word1 和 word2 几乎相等,请 你返回 true ,否则返回 false 。一个字母 x 的出现频率指的是它在字符串中出现的次数

这个题和上面的题相似,都是利用数组进行操作检查是否符合题意,不在赘述

bool checkAlmostEquivalent(char* word1, char* word2) 
{
    int a[26] = {0};
    while(*word1)
    {
        ++a[*word1 - 'a'];
        --a[*word2 - 'a'];

        ++word1;
        ++word2;
    }    
    int i=0;
    for(i=0;i<26;i++)
    {
        if(abs(a[i]) > 3)
            return false;
    }

    return true;
}

这是ac代码?

4.字符串解码

. - 力扣(LeetCode)

给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。 此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入

char* decodeString(char* s)
{
    static char a[100];
    int count = 0;
    Stack st;
    InitStack(&st);
    while (*s)
    {
        if (*s != ']')
        {
            PushStack(&st, *s);
            ++s;
        }
        else
        {
            Stack kk;
            InitStack(&kk);
            while (TopStack(&st) != '[')
            {
                PushStack(&kk, TopStack(&st));
                PopStack(&st);
            }
            PopStack(&st);
            int num = TopStack(&st) - '0';
            PopStack(&st);
            int i = 0;
            while (!StackEmpty(&kk))
            {
                i++;
                a[count++] = TopStack(&kk);
                PopStack(&kk);
            }
            while (--num)
            {
                int k = count - i;
                strncpy(a + count, a + k, i);
                count += i;
            }
            s++;
        }
    }
    a[count] = '\0';
    return a;
}

这里先放上不完全ac代码,这题有难度,得明天慢慢品了

今天的博客就到这里了,后续内容明天分享,最近因为考试周原因不能更新太多内容,等考试周结束了再"快马加鞭"

新手第一次写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!!!?

?

文章来源:https://blog.csdn.net/2301_80764270/article/details/135587188
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。