刷题坚持每一天,以下题目引用自:力扣(LeetCode)
原题链接:2278. 字母在字符串中的百分比
给你一个字符串 s 和一个字符 letter ,返回在 s 中等于 letter 字符所占的 百分比 ,向下取整到最接近的百分比。
示例 1:
输入:s = “foobar”, letter = “o”
输出:33
解释:
等于字母 ‘o’ 的字符在 s 中占到的百分比是 2 / 6 * 100% = 33% ,向下取整,所以返回 33 。
思路:
遍历字符串统计letter字符个数,然后除以总字符个数,得到百分率。
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;
}
原题链接:551. 学生出勤记录 I
给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:
- ‘A’:Absent,缺勤
- ‘L’:Late,迟到
- ‘P’:Present,到场
如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:
- 按 总出勤 计,学生缺勤(‘A’)严格 少于两天。
- 学生 不会 存在 连续 3 天或 连续 3 天以上的迟到(‘L’)记录。
如果学生可以获得出勤奖励,返回 true ;否则,返回 false 。
示例 1:
输入:s = “PPALLP”
输出:true
解释:学生缺勤次数少于 2 次,且不存在 3 天或以上的连续迟到记录。
思路:
统计
A
字符有没有大于或等于两个,有则返回false
,有没有连续3个字符为L
,有则返回false
。否则返回true
。
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;
}
原题链接: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 。
思路:
遍历字符串对字符单一比较,满足前缀要求,统计加一。
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;
}
原题链接:1071. 字符串的最大公因子
对于字符串 s 和 t,只有在 s = t + … + t(t 自身连接 1 次或多次)时,我们才认定 “t 能除尽 s”。
给定两个字符串 str1 和 str2 。返回 最长字符串 x,要求满足 x 能除尽 str1 且 X 能除尽 str2 。
示例 1:
输入:str1 = “ABCABC”, str2 = “ABC”
输出:“ABC”
思路:
把两个字符串分别前后的串接在一起,不相等返回空。否则求两个字符串长度的最大公约数,返回最大公约数的长度即可。
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+,在星球里你能够遇到一群志同道合之人,因为都是花钱进来的,你不会看到任何浑水摸鱼的人,每个人都有自己的每月规划,星主每月都会组织算法集训,每天一起刷题,你可以看到别人的解题报告,取其之长,补己之短。