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

43 阅读3分钟
这道题描述的是小R有一个字符串word,该字符由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后他希望统计在替换后剩下的整数中,不同整数的数目。以“a123bc34d8ef34”,替换后的字符串是“12334834”,剩下的整数是“123”,“34”,“8”,“34”,不同的整数就是3个,分别是“123”,“34”,“8”。这道题要考察的是字符串操作(正则表达式和字符串分割),集合的使用(去重和计数),字符串处理(去除前导零)还有边界情况处理(空字符串,无数字字符串和全数字字符串)。
解题思路:我们需要处理一个由数字和小写英文字母组成的字符串,目标是统计替换后剩下的不同整数的数量。首先我们要替换非数字字符使用正则表达式[^0-9]将字符串中的非数字字符替换为空格,接着分割字符串使用split("\\s+")方法将字符串按空格分割成多个字串,然后去除前导零对于每个子串使用replaceFirst("^0+","")方法去除前导零,最后去重和计数,将处理后的子串存入集合中,返回集合大小。
难点分析:字符串处理:如果需要将字符串中的非数字字符替换为空格。这可以通过正则表达式来实现,但需要注意正则表达式的正确使用,替换后,需要将字符串按空格分割成多个字串。这里需要注意处理多个连续空格的情况;去除前导零:在分割后的子串中,可能会有前导零的整数。需要去除这些前导零,以确保不同整数不会因为前导零而被误认为相同的;去重和计数:需要统计不同的整数的数量。这里可以使用集合来存储不同的整数,因为集合会自动去重;边界情况:需要考虑输入字符串为空,字符串中没有数字,全是数字的情况。、
word.replaceAll("[^0-9]","")考察的就是正则表达式的使用和字符串替换操作;replace.trim().split("\\s+")考察的就是字符串的分割操作和正则表达式的使用;Set<String>uniqueIntegers=new HashSet<>();考察的是集合的基本使用和去重功能;字符串处理:part.replaceFirst("^0+","")考察的是字符串的替换操作和正则表达式的使用。
以下为该题代码:
import java.util.HashSet;
import java.util.Set;

public class Main {
    public static int solution(String word) {
        String replaced = word.replaceAll("[^0-9]", " ");
        String[] parts = replaced.trim().split("\\s+");
        Set<String> uniqueIntegers = new HashSet<>();
        for (String part : parts) {
            if (!part.isEmpty()) {
                uniqueIntegers.add(part.replaceFirst("^0+", ""));
            }
        }
        return uniqueIntegers.size();
    }

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