【复盘】六月集训(第02天)——字符串
【复盘】六月集训(第02天)——字符串
-
- 一、前言
- 二、题目链接
- 三、解题思路
-
- 1. 字母在字符串中的百分比
- 2.学生出勤记录 I
- 3. 统计是给定字符串前缀的字符串数目
- 4. 字符串的最大公因子
一、前言
本篇文章是根据英雄哥的六月集训的直播刷题写的复盘。
今天是第二天,继续加油!
若有不对的地方,欢迎大佬们批评指正。
二、题目链接
2278. 字母在字符串中的百分比
551. 学生出勤记录 I
2255. 统计是给定字符串前缀的字符串数目
1071. 字符串的最大公因子
三、解题思路
1. 字母在字符串中的百分比
- 遍历一遍字符串计算出
letter
的数量再除以s
的长度即可。
class Solution { public static int percentageLetter(String s, char letter) { char[] chars = s.toCharArray(); int num = 0; String let = String.valueOf(letter); for(int i = 0;i < chars.length;i++) { String tmp = String.valueOf(chars[i]); if(tmp.equals(let)) { num++; } } return (num*100/chars.length); }}
2.学生出勤记录 I
- 先遍历数组计算出A的数量,判断A的数量是否小于2,再判断字符串是否包含
LLL
,两个条件都满足即返回true
。
class Solution { public boolean checkRecord(String s) { int absebt = 0; boolean late = false; char[] tmp = s.toCharArray(); for(int i = 0;i < tmp.length;i++) { if(tmp[i] == 'A') { absebt++; } } return absebt < 2 && !s.contains("LLL"); }}
3. 统计是给定字符串前缀的字符串数目
- 先遍历words数组,然后判断s是否包含words[i],若不包含则words[i]肯定不是s的前缀
- 若 s包含words[i],则遍历words[i]判断是否是s的前缀,若是,则
res++
。
class Solution { public int countPrefixes(String[] words, String s) { char[] tmp = s.toCharArray(); int res = 0; for(int i = 0;i < words.length;i++) { if(words[i].length() > s.length()) { continue; } if(s.contains(words[i])) { for(int j = 0;j < words[i].length();j++) { if(words[i].charAt(j) != s.charAt(j)) { break; }else if(j == words[i].length() - 1){ res++; } } } } return res; }}
4. 字符串的最大公因子
- 先判断是否存在 字符串的最大公因子,若存在,则利用辗转相除法算出最大公约数,字符串的最大公因子的长度就是最大公约数。然后在
str1
或者str2
从头截取最大公约数长度的子串即可。
什么是辗转相除法(GCD)呢?
例如,我们求24和60的最大公约数,假设最大公约数为m,所以24和60都可以被m整除,60可以表示为24+36,所以36也可以被m整除,所以问题就转化为求24和36的最大公约数,而36可以表示为24+12,以此类推,知道其中一个为0为止。
class Solution { public String gcdOfStrings(String str1, String str2) { //判断是否存在 字符串的最大公因子 if(!(str1 + str2).equals(str2 + str1)) { return ""; } return str1.substring(0,gcd(str1.length(),str2.length())); } //辗转相除法 public int gcd(int a,int b) { int remainder = a % b; while (remainder != 0) { a = b; b = remainder; remainder = a % b; } return b; }}