问题描述
小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
解题思路
- 字符串处理:首先需要遍历字符串,识别出其中的数字部分,并将它们存储起来。
- 去重:然后需要确保存储的数字是唯一的,即不同的整数。
- 前导零处理:最后需要确保存储的数字没有前导零。
下面是我的代码(可供大家参考一下)
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));
}
}
其中用法分析
- set用法:用set创建了一个uniqueNumbers,对于一个当前数字,利用add操作将其加入到set中,如果set中存在,则不进行添加。
- StringBuilder:stringbuilder会创建一个可以可变字符串,其中可以通过append() 操作函数将字符或者字符串添加到stringbuilder中,ToString() 可以将StringBuilder类型转化为String类型,setLength() 则可以设定stringbuilder长度,在代码中用于清空字符串。
- isDigit:这个操作函数则是判断所需处理字符是否为数字,若是,则返回true,否,则返回false。
- 强制转换:对于string转化为int——Interger.parseInt(string ),对于int转变为string——Interger.toString()
写在最后
这道题并不算很难,但是在写本题的过程中,你可以充分学习运用java中各种操作函数的用法,也可以增加对set的熟悉性,当然,本题用map映射也可以解决,具体用法有待大家自己去研究