Medium
题目描述
给你一个由正整数组成的数组 nums。
你必须取数组中的每个整数,反转其数字,并将其添加到数组的末尾。你应该将此操作应用于 nums 中的原始整数。
返回最终数组中不同整数的数目。
示例 1:
输入:nums = [1,13,10,12,31]
输出:6
解释:包含每个数字的反转之后,结果数组是 [1,13,10,12,31,1,31,1,21,13]。
加到数组末尾的反转整数用下划线标出。注意对于整数 10,反转之后变成 01,也就是 1。
数组中不同整数的数目是 6(数字 1、10、12、13、21 和 31)。
示例 2:
输入:nums = [2,2,2]
输出:1
解释:包含每个数字的反转之后,结果数组是 [2,2,2,2,2,2]。
数组中不同整数的数目是 1(数字 2)。
提示:
1 <= nums.length <= 10^51 <= nums[i] <= 10^6
解题思路
这道题的核心思路是使用哈希集合来统计不同的数字。
解题步骤:
理解题意:需要将原数组中每个数字及其反转后的数字都加入到结果中,然后统计不同数字的个数。
数字反转方法:对于一个整数,可以通过不断取模和整除来实现数字反转。例如 123 → 321,具体过程是:取个位数3,十位数2,百位数1,然后重新组合。
去重统计:使用哈希集合(Set)来自动去重,最后返回集合的大小即可。
算法流程:
- 创建一个哈希集合
- 遍历原数组,将每个数字添加到集合中
- 对每个数字进行反转,将反转后的结果也添加到集合中
- 返回集合的大小
注意事项:
- 反转数字时要处理前导零的情况,如 10 反转后是 01,应该是 1
- 使用集合可以自动处理重复数字的问题
这个解法时间复杂度为 O(n×log(max(nums))),空间复杂度为 O(n),是最直接高效的方法。
代码实现
class Solution {
public:
int countDistinctIntegers(vector<int>& nums) {
unordered_set<int> distinct;
for (int num : nums) {
// 添加原数字
distinct.insert(num);
// 反转数字
int reversed = 0;
int temp = num;
while (temp > 0) {
reversed = reversed * 10 + temp % 10;
temp /= 10;
}
// 添加反转后的数字
distinct.insert(reversed);
}
return distinct.size();
}
};
class Solution:
def countDistinctIntegers(self, nums: List[int]) -> int:
distinct = set()
for num in nums:
# 添加原数字
distinct.add(num)
# 反转数字
reversed_num = 0
temp = num
while temp > 0:
reversed_num = reversed_num * 10 + temp % 10
temp //= 10
# 添加反转后的数字
distinct.add(reversed_num)
return len(distinct)
public class Solution {
public int CountDistinctIntegers(int[] nums) {
HashSet<int> distinct = new HashSet<int>();
foreach (int num in nums) {
// 添加原数字
distinct.Add(num);
// 反转数字
int reversed = 0;
int temp = num;
while (temp > 0) {
reversed = reversed * 10 + temp % 10;
temp /= 10;
}
// 添加反转后的数字
distinct.Add(reversed);
}
return distinct.Count;
}
}
/**
* @param {number[]} nums
* @return {number}
*/
var countDistinctIntegers = function(nums) {
const distinct = new Set();
for (let num of nums) {
// 添加原数字
distinct.add(num);
// 反转数字
let reversed = 0;
let temp = num;
while (temp > 0) {
reversed = reversed * 10 + temp % 10;
temp = Math.floor(temp / 10);
}
// 添加反转后的数字
distinct.add(reversed);
}
return distinct.size;
};
复杂度分析
| 复杂度类型 | 分析 |
|---|---|
| 时间复杂度 | O(n × log(max(nums))),其中 n 是数组长度,log(max(nums)) 是反转数字的时间复杂度 |
| 空间复杂度 | O(n),哈希集合最多存储 2n 个不同的数字 |
相关题目
- . Reverse Integer (Medium)