力扣(1957,128) - day01

1957. 删除字符使字符串变好

解题思路

​ 要将给定字符串转换为 "好字符串"(即没有三个连续相同字符),我们可以通过遍历原字符串,并构建一个新的字符串来实现。在构建新字符串的过程中,每次添加字符时,检查新字符串的最后两个字符是否与当前要添加的字符相同。如果相同,则跳过当前字符(即不添加,实现删除效果);否则,将当前字符添加到新字符串中。

创建一个StringBuilder对象用于动态创建字符串,实现字符串的拼接。
复制代码
   StringBuilder str = new StringBuilder();

StringBuilder 比普通的 String 更适合进行字符串的拼接操作,因为它在修改字符串时不会创建新的对象,效率更高.
2.

将字符串转换为字符数组
复制代码
   char[] charArray = s.toCharArray();

​ 将输入字符串 s 转换为字符数组 charArray,以便后续遍历每个字符。
3.

检查是否有三个连续相同字符
复制代码
   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,并且当前字符 chstr 的倒数第一个字符(str.charAt(n - 1))和倒数第二个字符(str.charAt(n - 2))都相同,说明添加当前字符会导致出现三个连续相同的字符,因此使用 continue 跳过当前字符,不将其添加到 str 中,如果不满足上述三个连续相同字符的条件,就将当前字符 ch 添加到 str 中.
4.

返回结果字符串
复制代码
   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. 最长连续序列

解题思路
  1. 输入检查:首先检查输入数组的长度。如果数组为空,直接返回 0。

  2. 排序:对数组进行排序。排序后,连续的数字会相邻排列。

    复制代码
    Arrays.sort(nums);
  3. 初始化变量

    • ans:用于记录当前找到的最长连续序列的长度,初始值为 0。
    • tmp:用于记录当前正在计算的连续序列的长度,初始值为 1(因为至少有一个元素本身就是一个长度为 1 的序列)。
  4. 遍历数组

    • 如果当前元素与前一个元素相等,说明这两个元素是重复的,不影响连续序列的长度,跳过本次循环。

    • 如果当前元素比前一个元素大 1,说明找到了连续的数字,将tmp加 1。

    • 否则,说明当前连续序列结束,更新ans为当前anstmp中的较大值,并将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;
      }
      }

  5. 返回结果

完整代码:
复制代码
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);
    }
}
相关推荐
测试199829 分钟前
软件测试 - 单元测试总结
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
Mahir083 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
曲幽3 小时前
我用了FastApiAdmin后,连夜把踩过的坑都整理出来了
redis·python·postgresql·vue3·fastapi·web·sqlalchemy·admin·fastapiadmin
RyFit4 小时前
SpringAI 常见问题及解决方案大全
java·ai
石山代码4 小时前
C++ 内存分区 堆区
java·开发语言·c++
心中有国也有家4 小时前
cann-recipes-infer:昇腾 NPU 推理的“菜谱集合”
经验分享·笔记·学习·算法
前端若水4 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
绝知此事4 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
无风听海4 小时前
C# 隐式转换深度解析
java·开发语言·c#
碧海银沙音频科技研究院5 小时前
通话AEC与语音识别AEC的软硬回采链路
深度学习·算法·语音识别