问题描述
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
解题代码
import java.util.Set;
class Main {
public static int solution(String word) {
// 调用 replaceNonDigitsWithSpaces 方法,将非数字字符替换为空格
String replacedWord = replaceNonDigitsWithSpaces(word);
// 调用 countDistinctIntegers 方法,统计不同的整数
return countDistinctIntegers(replacedWord);
}
private static String replaceNonDigitsWithSpaces(String word) {
StringBuilder replacedWord = new StringBuilder();
for (char c : word.toCharArray()) {
if (Character.isDigit(c)) {
replacedWord.append(c);
} else {
replacedWord.append(' ');
}
}
return replacedWord.toString();
}
private static int countDistinctIntegers(String replacedWord) {
Set<String> distinctIntegers = new HashSet<>();
StringBuilder currentInteger = new StringBuilder();
for (char c : replacedWord.toCharArray()) {
if (Character.isDigit(c)) {
currentInteger.append(c);
} else {
if (currentInteger.length() > 0) {
// 去除前导零并添加到 Set 中
distinctIntegers.add(String.valueOf(Integer.parseInt(currentInteger.toString())));
currentInteger.setLength(0);
}
}
}
if (currentInteger.length() > 0) {
// 去除前导零并添加到 Set 中
distinctIntegers.add(String.valueOf(Integer.parseInt(currentInteger.toString())));
}
return distinctIntegers.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);
}
}
知识点分析
哈希表
哈希表(Hash Table),也称为散列表,是一种数据结构,它通过将键值对映射到一个固定大小的数组中来实现快速的查找、插入和删除操作。以下是关于哈希表的详细介绍:
-
基本概念
- 哈希函数:哈希表的核心是哈希函数,它将输入(键)转换为一个整数,这个整数通常用于计算数组索引。哈希函数的设计对于减少冲突和提高性能至关重要。
- 桶:在哈希表中,每个位置称为一个“桶”或“槽”,用于存储键值对。当发生哈希冲突时,多个键值对可能会被存储在同一个桶中。
-
工作原理
- 查找操作:通过哈希函数计算出键的索引位置,然后直接访问该位置的值。
- 插入操作:使用哈希函数计算键的索引,然后将键值对存储到相应的桶中。如果桶已被占用,则根据冲突解决策略进行处理。
- 删除操作:使用哈希函数找到相应的索引位置,并删除该位置的键值对。
-
哈希冲突
- 链式法:每个桶存储一个链表,当多个键映射到相同的索引时,这些键值对会被添加到该索引位置的链表中。
- 开放地址法:当发生冲突时,哈希表会尝试寻找下一个空的位置来存储数据,直到找到一个空桶或目标桶。
-
时间复杂度
- 在理想情况下,哈希表的查找、插入和删除操作的时间复杂度为O(1),即常数时间。然而,如果发生哈希冲突并且哈希表的负载因子过高(即存储元素数量接近哈希表容量),这些操作的时间复杂度可能会退化为O(n)(例如,当所有元素都被存储在同一个链表中时)。
-
优缺点
- 优点:查找速度快,插入和删除速度快,扩展性好。
- 缺点:存在哈希冲突,需要处理冲突的方法;内存浪费,因为需要一个固定大小的数组;依赖好的哈希函数设计。
-
应用场景
- 字典和映射:许多编程语言的标准库都提供了哈希表实现,用来存储键值对。
- 缓存:哈希表广泛用于实现缓存机制,因为它能够提供快速的查找操作。
- 数据库索引:在数据库中,哈希表常用于实现索引,以加速查询操作。
- 去重:哈希表可以快速判断一个元素是否存在,因此常用于去重操作。
哈希表是一种高效的数据结构,适用于需要快速查找、插入和删除操作的场景。然而,它也需要注意哈希冲突的处理和内存管理的问题。