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

75 阅读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

解题思路

  1. 字符串处理:首先需要遍历字符串,识别出其中的数字部分,并将它们存储起来。
  2. 去重:然后需要确保存储的数字是唯一的,即不同的整数。
  3. 前导零处理:最后需要确保存储的数字没有前导零。

下面是我的代码(可供大家参考一下)

import java.util.*;
public class Main {
    public static int solution(String s) {
        Set<Integer> uniqueNumbers = new HashSet<>();
        StringBuilder currentNumber = new StringBuilder();
        boolean isProcessingNumber = false;

        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) {
                // 处理数字字符
                currentNumber.append(c);
                isProcessingNumber = true;
            } else {
                // 处理非数字字符
                if (isProcessingNumber) {
                    // 将当前数字转换为整数并去除前导零
                    int number = Integer.parseInt(currentNumber.toString());
                    uniqueNumbers.add(number);
                    currentNumber.setLength(0); // 清空StringBuilder
                }
                isProcessingNumber = false;
            }
        }

        // 处理最后一个数字
        if (isProcessingNumber) {
            int number = Integer.parseInt(currentNumber.toString());
            uniqueNumbers.add(number);
        }

        return uniqueNumbers.size();
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        System.out.println(solution(s));
    }
}

其中用法分析

  1. set用法:用set创建了一个uniqueNumbers,对于一个当前数字,利用add操作将其加入到set中,如果set中存在,则不进行添加。
  2. StringBuilder:stringbuilder会创建一个可以可变字符串,其中可以通过append() 操作函数将字符或者字符串添加到stringbuilder中,ToString() 可以将StringBuilder类型转化为String类型,setLength() 则可以设定stringbuilder长度,在代码中用于清空字符串。
  3. isDigit:这个操作函数则是判断所需处理字符是否为数字,若是,则返回true,否,则返回false
  4. 强制转换:对于string转化为int——Interger.parseInt(string ),对于int转变为string——Interger.toString()

写在最后

这道题并不算很难,但是在写本题的过程中,你可以充分学习运用java中各种操作函数的用法,也可以增加对set的熟悉性,当然,本题用map映射也可以解决,具体用法有待大家自己去研究