Easy
题目描述
给你一个正整数数组 nums ,返回一个数组 answer ,该数组由 nums 中每个整数的数位按相同顺序分离后组成。
分离整数的数位就是按相同顺序获得该整数的所有数位。
例如,对于整数 10921,其数位的分离结果为 [1,0,9,2,1]。
示例 1:
输入:nums = [13,25,83,77]
输出:[1,3,2,5,8,3,7,7]
解释:
- 13 的分离结果为 [1,3]
- 25 的分离结果为 [2,5]
- 83 的分离结果为 [8,3]
- 77 的分离结果为 [7,7]
answer = [1,3,2,5,8,3,7,7]。注意 answer 包含的分离结果按相同顺序排列。
示例 2:
输入:nums = [7,1,3,9]
输出:[7,1,3,9]
解释:nums 中每个整数的分离结果都是其本身。
answer = [7,1,3,9]。
提示:
1 <= nums.length <= 10001 <= nums[i] <= 10^5
提示:
- 将每个数字转换为列表并将该列表附加到答案中
- 你可以将整数转换为字符串来轻松完成此操作
解题思路
这道题要求我们将数组中的每个整数的数位分离出来,按顺序组成一个新数组。
解题思路
有两种常见的解法:
字符串方法:将每个数字转换为字符串,然后遍历字符串的每一位,将字符转回数字。这是最直观和简单的方法。
数学方法:通过除法和取模运算来提取每一位数字。不过需要注意数位的顺序,可能需要先提取再反转,或者使用递归。
推荐使用字符串方法,因为:
- 代码更简洁易懂
- 不需要考虑数位顺序问题
- 性能在题目约束范围内完全够用
算法步骤
- 初始化结果数组
- 遍历输入数组中的每个数字
- 将当前数字转为字符串
- 遍历字符串的每一位,转为数字并添加到结果数组
- 返回结果数组
时间复杂度主要取决于所有数字的总位数,在最坏情况下,每个数字都是 10^5(5位数),所以总体复杂度是合理的。
代码实现
class Solution {
public:
vector<int> separateDigits(vector<int>& nums) {
vector<int> result;
for (int num : nums) {
string str = to_string(num);
for (char c : str) {
result.push_back(c - '0');
}
}
return result;
}
};
class Solution:
def separateDigits(self, nums: List[int]) -> List[int]:
result = []
for num in nums:
for digit in str(num):
result.append(int(digit))
return result
public class Solution {
public int[] SeparateDigits(int[] nums) {
List<int> result = new List<int>();
foreach (int num in nums) {
string str = num.ToString();
foreach (char c in str) {
result.Add(c - '0');
}
}
return result.ToArray();
}
}
var separateDigits = function(nums) {
const result = [];
for (const num of nums) {
const str = num.toString();
for (const digit of str) {
result.push(parseInt(digit));
}
}
return result;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n × d) | n 是数组长度,d 是平均每个数字的位数 |
| 空间复杂度 | O(n × d) | 存储结果数组所需的空间 |