《六月集训》第二天——字符串

文章目录

  • 前言
  • 一、题目一
    • 1.题目描述
    • 2.解题思路
    • 3.代码详解
  • 二、题目二
    • 1.题目描述
    • 2.解题思路
    • 3.代码详解
  • 三、题目三
    • 1.题目描述
    • 2.解题思路
    • 3.代码详解
  • 四、题目四
    • 1.题目描述
    • 2.解题思路
    • 3.代码详解
  • 五、星球推荐


前言

        
刷题坚持每一天,以下题目引用自:力扣(LeetCode)

一、题目一

1.题目描述

原题链接:2278. 字母在字符串中的百分比

        给你一个字符串 s 和一个字符 letter ,返回在 s 中等于 letter 字符所占的 百分比 ,向下取整到最接近的百分比。

示例 1:
输入:s = “foobar”, letter = “o”
输出:33
解释:
等于字母 ‘o’ 的字符在 s 中占到的百分比是 2 / 6 * 100% = 33% ,向下取整,所以返回 33 。

2.解题思路

思路:

​         遍历字符串统计letter字符个数,然后除以总字符个数,得到百分率。

3.代码详解

int percentageLetter(char * s, char letter){
    int i;
    int count = 0;
    for(i = 0; s[i] != '\0'; ++i){
        if(s[i] == letter) ++count;
    }
    int ans = (count*100)/i;
    return ans;
}

二、题目二

1.题目描述

原题链接:551. 学生出勤记录 I

给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:

  • ‘A’:Absent,缺勤
  • ‘L’:Late,迟到
  • ‘P’:Present,到场

如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:

  • 按 总出勤 计,学生缺勤(‘A’)严格 少于两天。
  • 学生 不会 存在 连续 3 天或 连续 3 天以上的迟到(‘L’)记录。

如果学生可以获得出勤奖励,返回 true ;否则,返回 false 。

示例 1:
输入:s = “PPALLP”
输出:true
解释:学生缺勤次数少于 2 次,且不存在 3 天或以上的连续迟到记录。

2.解题思路

思路:

​         统计A字符有没有大于或等于两个,有则返回false,有没有连续3个字符为L,有则返回false。否则返回true

3.代码详解

bool checkRecord(char * s){
    int absent = 0, late = 0;
    int count = 0;
    for(int i = 0; s[i] != '\0'; ++i){
        if(s[i] == 'A') ++absent;
        else if(s[i] == 'L' && s[i+1] != '\0' && s[i+2] != '\0'){
            if(s[i] == 'L' && s[i+1] == 'L' && s[i+2] == 'L')
                return false;
        } 
        if(absent >= 2) return false;
    }
    return true;
}

三、题目三

1.题目描述

原题链接:2255. 统计是给定字符串前缀的字符串数目

        给你一个字符串数组 words 和一个字符串 s ,其中 words[i] 和 s 只包含 小写英文字母 。
        请你返回 words 中是字符串 s 前缀 的 字符串数目 。
        一个字符串的 前缀 是出现在字符串开头的子字符串。子字符串 是一个字符串中的连续一段字符序列。

示例 1:
输入:words = [“a”,“b”,“c”,“ab”,“bc”,“abc”], s = “abc”
输出:3
解释:
words 中是 s = “abc” 前缀的字符串为:
“a” ,“ab” 和 “abc” 。
所以 words 中是字符串 s 前缀的字符串数目为 3 。

2.解题思路

思路:

​        遍历字符串对字符单一比较,满足前缀要求,统计加一。

3.代码详解

int countPrefixes(char ** words, int wordsSize, char * s){
    int i, j;
    int ans = 0;
    for(i = 0; i < wordsSize; ++i){
        for(j = 0; words[i][j] != '\0'; ++j){
            if(words[i][j] != s[j]) break;
        }
        if(words[i][j] == '\0') ++ans;
    }
    return ans;
}

四、题目四

1.题目描述

原题链接:1071. 字符串的最大公因子

        对于字符串 s 和 t,只有在 s = t + … + t(t 自身连接 1 次或多次)时,我们才认定 “t 能除尽 s”。
        给定两个字符串 str1 和 str2 。返回 最长字符串 x,要求满足 x 能除尽 str1 且 X 能除尽 str2 。

示例 1:
输入:str1 = “ABCABC”, str2 = “ABC”
输出:“ABC”

2.解题思路

思路:

​         把两个字符串分别前后的串接在一起,不相等返回空。否则求两个字符串长度的最大公约数,返回最大公约数的长度即可。

3.代码详解

int gcd(int a, int b) {      //辗转求最大公因数
    return !b ? a : gcd(b, a % b);
}
char * gcdOfStrings(char * str1, char * str2){
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    char tx1[len1+len2+1];
    char tx2[len1+len2+1];
    strcpy(tx1, str1);
    strcpy(tx2, str2);
    strcat(tx1, str2);
    strcat(tx2, str1);
    if(strcmp(tx1, tx2)) return "";
    int len = gcd(len1, len2);
    str1[len] = '\0';
    return str1;
}

五、星球推荐

        星球链接:英雄算法联盟

星球里有什么?
        【朋友圈】一个极致精准的自律、编程、算法的小圈子。
        【算法集训】以月为单位组织算法集训,每天四题,风雨无阻。
        【排行榜】每天、每周都会有榜单,激励大家不断进步,不断成长。
        【个人规划】每个人都写好自己的规划,也可以查看他人的规划,时刻警醒自己不掉队。
        【打卡挑战】每日一题打卡、每日早起打卡、算法集训打卡、规划完成情况打卡。
在星球里做什么?
        目前星球人数达到510+,在星球里你能够遇到一群志同道合之人,因为都是花钱进来的,你不会看到任何浑水摸鱼的人,每个人都有自己的每月规划,星主每月都会组织算法集训,每天一起刷题,你可以看到别人的解题报告,取其之长,补己之短。

你可能感兴趣的:(刷题,算法,leetcode,c语言)