不同整数的计数问题 | 豆包MarsCode AI刷题

197 阅读4分钟

题目解析与代码实现

题目描述

小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。

示例

  • 输入: word = "a123bc34d8ef34"

  • 输出: 3

    • 解释: 替换后形成的字符串是 "123 34 8 34",剩下的整数是 "123""34""8" 和 "34"。不同的整数有三个,即 "123""34" 和 "8"
  • 输入: word = "t1234c23456"

  • 输出: 2

    • 解释: 替换后形成的字符串是 "1234 23456",剩下的整数是 "1234" 和 "23456"。不同的整数有两个,即 "1234" 和 "23456"
  • 输入: word = "a1b01c001d4"

  • 输出: 2

    • 解释: 替换后形成的字符串是 "1 01 001 4",剩下的整数是 "1""01""001" 和 "4"。不同的整数有两个,即 "1" 和 "4"

思路解析

  1. 替换非数字字符:将字符串中所有非数字字符替换为空格。
  2. 分割字符串:使用空格将字符串分割成多个子字符串。
  3. 去除前导零:去除每个子字符串的前导零。
  4. 统计不同整数:使用 HashSet 来存储不同的整数,最后返回 HashSet 的大小。

代码实现

java
深色版本
import java.util.HashSet;
import java.util.Set;

class Main {
    public static int solution(String word) {
        StringBuilder sb = new StringBuilder();
        
        // Step 1: Replace all non-digit characters with spaces
        for (char c : word.toCharArray()) {
            if (Character.isDigit(c)) {
                sb.append(c);
            } else {
                sb.append(' ');
            }
        }
        
        // Step 2: Split the string by spaces to get the numbers
        String[] numbers = sb.toString().trim().split("\s+");
        
        // Step 3: Use a HashSet to store unique numbers
        Set<String> uniqueNumbers = new HashSet<>();
        for (String num : numbers) {
            if (!num.isEmpty()) {
                // Remove leading zeros
                num = num.replaceFirst("^0+", "");
                uniqueNumbers.add(num);
            }
        }
        
        // Step 4: Return the count of unique numbers
        return uniqueNumbers.size();
    }

    public static void main(String[] args) {
        System.out.println(solution("a123bc34d8ef34") == 3); // true
        System.out.println(solution("t1234c23456") == 2); // true
        System.out.println(solution("a1b01c001d4") == 2); // true
    }
}

代码解析

  1. 替换非数字字符

    • 使用 StringBuilder 构建一个新的字符串,遍历原字符串的每个字符,如果是数字则直接添加到 StringBuilder 中,否则添加一个空格。
  2. 分割字符串

    • 使用 trim() 去除字符串两端的空格,然后使用 split("\s+") 按照一个或多个空格分割字符串,得到一个包含多个子字符串的数组。
  3. 去除前导零

    • 使用 replaceFirst("^0+", "") 去除每个子字符串的前导零,确保整数的表示形式唯一。
  4. 统计不同整数

    • 使用 HashSet 存储不同的整数,最后返回 HashSet 的大小。

学习心得

通过这道题的练习,我深刻体会到了字符串处理的重要性。字符串处理是编程中非常常见的任务,掌握好字符串处理的方法可以大大提高编程效率。在这道题中,我们使用了 StringBuildersplittrim 和正则表达式等工具,这些工具在处理字符串时非常方便。

  1. StringBuilderStringBuilder 是一个可变字符串类,可以在不创建新对象的情况下修改字符串内容,非常适合用于频繁修改字符串的场景。
  2. splitsplit 方法可以根据指定的正则表达式将字符串分割成多个子字符串,非常灵活。
  3. trimtrim 方法可以去除字符串两端的空格,确保字符串的整洁。
  4. 正则表达式:正则表达式是一种强大的文本处理工具,可以用来匹配、查找、替换字符串中的特定模式。

通过这道题的练习,我也学会了如何将多个字符串处理方法结合起来,解决复杂的问题。希望这些经验和技巧能对其他初学者有所帮助。

学习建议

  1. 多练习:多做一些类似的字符串处理题目,熟悉各种字符串处理方法。
  2. 查阅文档:遇到不熟悉的字符串处理方法时,可以查阅官方文档,了解其详细用法。
  3. 实践项目:在实际项目中应用字符串处理技巧,巩固所学知识。

希望这篇博客能对你有所帮助,如果你有任何问题或建议,欢迎在评论区留言交流!