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

75 阅读3分钟

问题描述

小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。

例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123""34""8" 和 "34"。不同的整数有三个,即 "123""34" 和 "8"

注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。


测试样例

样例1:

输入:word = "a123bc34d8ef34"
输出:3

样例2:

输入:word = "t1234c23456"
输出:2

样例3:

输入:word = "a1b01c001d4"
输出:2

解题思考

本题要求处理一个由数字和小写英文字母组成的字符串,将非数字字符替换为空格,然后统计替换后形成的整数中不同整数的数目。解题的关键在于如何有效地从字符串中提取数字,并去除重复的整数。

关键步骤

  1. 字符替换:使用正则表达式将所有非数字字符替换为空格。
  2. 字符串分割:将替换后的字符串按空格分割,得到包含数字的子字符串数组。
  3. 整数转换:将每个子字符串转换为整数。
  4. 去重统计:使用集合(如HashSet)存储转换后的整数,利用集合的特性自动去除重复的整数。
  5. 结果输出:集合的大小即为不同整数的数目。

Java 程序代码

import java.util.Set;
import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        String[] testSamples = {"a123bc34d8ef34", "t1234c23456", "a1b01c001d4"};
        for (String sample : testSamples) {
            System.out.println("输入:word = \"" + sample + "\"\n输出:" + countDistinctIntegers(sample));
        }
    }

    public static int countDistinctIntegers(String word) {
        // 替换非数字字符为空格
        String processed = word.replaceAll("[^0-9]", " ");
        
        // 分割字符串
        String[] numbers = processed.split("\\s+");
        
        // 使用HashSet去重
        Set<Integer> distinctIntegers = new HashSet<>();
        for (String number : numbers) {
            // 只有当字符串不为空时才转换为整数
            if (!number.isEmpty()) {
                distinctIntegers.add(Integer.parseInt(number));
            }
        }
        
        // 返回不同整数的数目
        return distinctIntegers.size();
    }
}

总结

本题的解决方案涉及到字符串处理和集合的使用。通过正则表达式替换非数字字符为空格,我们可以将数字字符分隔开。然后,通过分割字符串和转换为整数,我们可以提取出所有的整数。使用HashSet存储整数是去重的关键,因为集合不允许重复元素。这种方法不仅代码简洁,而且效率较高,适用于处理包含大量数据的字符串。在实际应用中,这种方法可以扩展到更复杂的文本处理场景,如日志分析、数据清洗等。通过这种方式,我们可以有效地从复杂的数据中提取有用信息,并进行统计分析。