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

36 阅读2分钟

问题描述

小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

根据题目意思首先得将输入字符串中的非数字字符替换为空格,然后去除首尾空格并按空格分割成数字字符串数组。创建一个HashSet集合,遍历数组,使用正则表达式去除每个数字字符串的前导零,并将其添加到集合中。由于HashSet自动去重,最后返回集合的大小即为不同整数的数量。下面是具体实现步骤:

  1. 使用正则表达式将输入字符串中所有非数字字符替换为空格。正则表达式 <font style="color:rgb(26, 32, 41);">[^0-9]</font> 匹配任何非数字字符,并用 <font style="color:rgb(26, 32, 41);">replaceAll</font> 方法将其替换为单个空格。
  2. 去除替换后字符串首尾的空格,并使用空格作为分隔符将字符串分割成字符串数组,每个元素代表一个数字字符串。
  3. 创建一个 <font style="color:rgb(26, 32, 41);">HashSet</font> 集合,用于存储不包含前导零的唯一数字字符串。
  4. 遍历步骤2中得到的字符串数组:
    • 对于数组中的每个元素(即每个数字字符串),首先检查它是否为空(即是否全部由前导零组成)。
    • 使用正则表达式 <font style="color:rgb(26, 32, 41);">^0+(?!$)</font> 匹配并去除字符串开头的零(但不是全部的零,即如果字符串全是零,则保留一个零)。<font style="color:rgb(26, 32, 41);">^0+</font> 匹配一个或多个零,<font style="color:rgb(26, 32, 41);">(?!$)</font> 是一个负向前瞻,确保不是字符串的末尾。
    • 将处理后的数字字符串添加到 <font style="color:rgb(26, 32, 41);">HashSet</font> 集合中。
  5. 集合 <font style="color:rgb(26, 32, 41);">HashSet</font> 自动处理重复项,因此集合的大小即为不同整数的数量。
  6. 返回 <font style="color:rgb(26, 32, 41);">HashSet</font> 集合的大小。

import java.util.*;

class Main {
    public static int solution(String word) {
        // write code here

        String numbersOnly = word.replaceAll("[^0-9]", " ");
        String[] numbers = numbersOnly.trim().split("\\s+");
        Set<String> uniqueNumbers = new HashSet<>();

        for (String number : numbers) {
            if (!number.isEmpty()) {
                // 去除前导零
                if (number.equals("0")) {
                    uniqueNumbers.add("0");
                    continue;
                }
                String numberWithoutLeadingZeros = number.replaceFirst("^0+(?!$)", "");
                // 添加到集合中
                // System.out.println(numberWithoutLeadingZeros);
                uniqueNumbers.add(numberWithoutLeadingZeros);
            }
        }

        return uniqueNumbers.size();
    }

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