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

41 阅读4分钟

问题描述

小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),也称为散列表,是一种数据结构,它通过将键值对映射到一个固定大小的数组中来实现快速的查找、插入和删除操作。以下是关于哈希表的详细介绍:

  1. 基本概念

    • 哈希函数:哈希表的核心是哈希函数,它将输入(键)转换为一个整数,这个整数通常用于计算数组索引。哈希函数的设计对于减少冲突和提高性能至关重要。
    • :在哈希表中,每个位置称为一个“桶”或“槽”,用于存储键值对。当发生哈希冲突时,多个键值对可能会被存储在同一个桶中。
  2. 工作原理

    • 查找操作:通过哈希函数计算出键的索引位置,然后直接访问该位置的值。
    • 插入操作:使用哈希函数计算键的索引,然后将键值对存储到相应的桶中。如果桶已被占用,则根据冲突解决策略进行处理。
    • 删除操作:使用哈希函数找到相应的索引位置,并删除该位置的键值对。
  3. 哈希冲突

    • 链式法:每个桶存储一个链表,当多个键映射到相同的索引时,这些键值对会被添加到该索引位置的链表中。
    • 开放地址法:当发生冲突时,哈希表会尝试寻找下一个空的位置来存储数据,直到找到一个空桶或目标桶。
  4. 时间复杂度

    • 在理想情况下,哈希表的查找、插入和删除操作的时间复杂度为O(1),即常数时间。然而,如果发生哈希冲突并且哈希表的负载因子过高(即存储元素数量接近哈希表容量),这些操作的时间复杂度可能会退化为O(n)(例如,当所有元素都被存储在同一个链表中时)。
  5. 优缺点

    • 优点:查找速度快,插入和删除速度快,扩展性好。
    • 缺点:存在哈希冲突,需要处理冲突的方法;内存浪费,因为需要一个固定大小的数组;依赖好的哈希函数设计。
  6. 应用场景

    • 字典和映射:许多编程语言的标准库都提供了哈希表实现,用来存储键值对。
    • 缓存:哈希表广泛用于实现缓存机制,因为它能够提供快速的查找操作。
    • 数据库索引:在数据库中,哈希表常用于实现索引,以加速查询操作。
    • 去重:哈希表可以快速判断一个元素是否存在,因此常用于去重操作。

哈希表是一种高效的数据结构,适用于需要快速查找、插入和删除操作的场景。然而,它也需要注意哈希冲突的处理和内存管理的问题。