力扣(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);
    }
}
相关推荐
Thanks_ks12 小时前
透过 Copy-On-Write 机制:理解并发编程中的性能与一致性权衡
java·多线程·并发编程·底层原理·写时复制·copyonwrite·性能优
MegaDataFlowers13 小时前
SiliconCompiler workflow
算法
清水白石00813 小时前
从“类型体操”到工程设计:用 Python 解释协变、逆变与不变
网络·windows·python
_日拱一卒13 小时前
LeetCode:226翻转二叉树
数据结构·算法·leetcode
一只幸运猫.13 小时前
JAVA后端面试题
java·开发语言
空中海13 小时前
第三章:Maven高级篇 — 插件开发与多模块工程
java·maven
hrhcode13 小时前
【LangGraph】四.持久化:保存和恢复执行状态
python·ai·langchain·agent·langgraph
BirdenT13 小时前
20260424紫题训练
c++·算法
秋913 小时前
TiDB 数据库全链路实战指南:从下载部署到 Java 高并发调优
java·数据库·tidb
还是阿落呀13 小时前
基本控制结构
开发语言·c++·算法