leetcode
leetcode 2101 ~ 2150
反转之后不同整数的数目

反转之后不同整数的数目

难度:

标签:

题目描述

代码结果

运行时间: 153 ms, 内存: 41.8 MB


/*
 * 思路:
 * 1. 使用Java Stream API遍历原数组,将原数字和反转后的数字都加入到流中。
 * 2. 使用Collectors.toSet()来收集所有不同的数字。
 * 3. 返回集合的大小。
 */
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;

public class Solution {
    public int countDistinctIntegers(int[] nums) {
        Set<Integer> set = Arrays.stream(nums)
                                  .boxed() // 将int流转换为Integer流
                                  .flatMap(num -> Arrays.stream(new Integer[]{num, reverseNumber(num)}))
                                  .collect(Collectors.toSet());
        return set.size();
    }

    // 反转数字的辅助函数
    private int reverseNumber(int num) {
        int reversed = 0;
        while (num > 0) {
            reversed = reversed * 10 + num % 10;
            num /= 10;
        }
        return reversed;
    }
}

解释

方法:

该题解采用了直接的方法来解决问题。首先,遍历数组 nums 中的每个整数,将其转换为字符串,然后反转字符串,并将反转后的字符串再转换回整数。这些反转后的整数被添加到原始数组 nums 的末尾。利用 Python 的 set 数据结构,可以自动过滤掉重复的元素,因此最后返回 set(nums) 的长度即可得到不同整数的数目。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
题解中提到将反转后的整数添加到原始数组的末尾,这种操作是否会影响遍历过程中的数字反转?
在题解的实现中,将反转后的整数添加到原始数组 nums 的末尾确实可能会影响遍历过程,因为这种操作改变了数组的长度。然而,在此题解的 for 循环中,循环的终止条件是固定的,即在循环开始前就通过 len(nums) 确定,这意味着遍历的范围不会因为数组长度的增加而改变。因此,尽管数组长度增加了,但遍历的次数是基于原始数组的长度,不会遍历到新增的反转后的整数。
🦆
在反转数字并转换为整数时,如何处理数字前导0的情况,比如将10反转为01后转换成整数1,在代码实现上有特殊处理吗?
在 Python 中,将字符串转换为整数时,前导零会自动被忽略。例如,字符串 '01' 在转换为整数时会变成 1。因此,在题解中,通过 str(nums[i])[::-1] 反转字符串并用 int() 函数转换回整数时,自动处理了前导零的问题,不需要特殊的处理措施。
🦆
题解中使用了set来去除重复元素,set的内部机制在处理大量数据时的效率如何?是否存在性能瓶颈?
Python 中的 set 是基于哈希表实现的,这使得其在插入和查找操作上的平均时间复杂度为 O(1)。然而,当处理大量数据时,哈希表可能需要多次重新哈希以调整大小,这可能会导致性能下降,特别是在内存受限的情况下。此外,哈希冲突的增加也可能降低性能。尽管 set 的去重操作通常效率较高,但在极端情况下,性能可能会成为瓶颈。
🦆
题解中如果数组nums非常大,这种方法的扩展性如何?是否有更高效的方法来处理大数据量的情况?
如果数组 nums 非常大,当前的方法可能不是最优的。首先,数组长度的增加导致内存消耗增加,因为反转的整数被添加到数组中,实际上使数组大小翻倍。其次,遍历和反转操作本身就需要 O(n) 时间。一种更高效的方法可能是先计算出所有反转的整数,然后将这些整数与原始数组合并,一次性转换为 set,避免了数组大小的翻倍,也减少了不必要的内存占用。

相关问题