力扣(1957,128) - day01
1957. 删除字符使字符串变好
解题思路
要将给定字符串转换为 “好字符串”(即没有三个连续相同字符),我们可以通过遍历原字符串,并构建一个新的字符串来实现。在构建新字符串的过程中,每次添加字符时,检查新字符串的最后两个字符是否与当前要添加的字符相同。如果相同,则跳过当前字符(即不添加,实现删除效果);否则,将当前字符添加到新字符串中。
-
创建一个StringBuilder对象用于动态创建字符串,实现字符串的拼接。
StringBuilder str = new StringBuilder();
StringBuilder
比普通的String
更适合进行字符串的拼接操作,因为它在修改字符串时不会创建新的对象,效率更高. -
将字符串转换为字符数组
char[] charArray = s.toCharArray();
将输入字符串
s
转换为字符数组charArray
,以便后续遍历每个字符。 -
检查是否有三个连续相同字符
for (char ch : charArray) {int n = str.length(); if(n >= 2 && ch == str.charAt(n-1) && ch == str.charAt(n-2)){continue; } str.append(ch);}
获取当前
StringBuilder
对象str
的长度,记为n
,如果当前StringBuilder
的长度n
大于等于 2,并且当前字符ch
与str
的倒数第一个字符(str.charAt(n - 1)
)和倒数第二个字符(str.charAt(n - 2)
)都相同,说明添加当前字符会导致出现三个连续相同的字符,因此使用continue
跳过当前字符,不将其添加到str
中,如果不满足上述三个连续相同字符的条件,就将当前字符ch
添加到str
中. -
返回结果字符串
return str.toString();
将
StringBuilder
对象str
转换为普通的String
类型,并返回处理后的结果字符串。
完整代码:
public static void main(String[] args) { String s = \"aaabaaaa\"; StringBuilder str = new StringBuilder(); char[] charArray = s.toCharArray(); for (char ch : charArray) { int n = str.length(); if(n >= 2 && ch == str.charAt(n-1) && ch == str.charAt(n-2)){ continue; } str.append(ch); } System.out.println(str); }
128. 最长连续序列
解题思路
-
输入检查:首先检查输入数组的长度。如果数组为空,直接返回 0。
-
排序:对数组进行排序。排序后,连续的数字会相邻排列。
Arrays.sort(nums);
-
初始化变量
ans
:用于记录当前找到的最长连续序列的长度,初始值为 0。tmp
:用于记录当前正在计算的连续序列的长度,初始值为 1(因为至少有一个元素本身就是一个长度为 1 的序列)。
-
遍历数组
- 如果当前元素与前一个元素相等,说明这两个元素是重复的,不影响连续序列的长度,跳过本次循环。
- 如果当前元素比前一个元素大 1,说明找到了连续的数字,将
tmp
加 1。 - 否则,说明当前连续序列结束,更新
ans
为当前ans
和tmp
中的较大值,并将tmp
重置为 1,开始计算新的连续序列。
for (int i = 1; i < nums.length; i++) { if (nums[i] == nums[i - 1]) { continue; } else if (nums[i] == nums[i - 1] + 1) { tmp++; } else { ans = Math.max(ans, tmp); tmp = 1; }}
-
返回结果
完整代码:
class Solution { public int longestConsecutive(int[] nums) { if(nums.length == 0) return 0; Arrays.sort(nums); int ans = 0; int tmp = 1; for(int i = 1; i < nums.length; i++){ if(nums[i] == nums[i-1]){ continue; }else if(nums[i] == nums[i-1] + 1){ tmp++; }else{ ans = Math.max(ans, tmp); tmp = 1; } } return Math.max(ans, tmp); }}