LeetCode 每日一题笔记
0. 前言
- 日期:2026.05.11
- 题目:2553. 分割数组中数字的数位
- 难度:简单
- 标签:数组、字符串、模拟
1. 题目理解
问题描述 :
给定一个正整数数组 nums,要求将每个整数按其原始数位顺序分割后,依次存入结果数组 answer 中,保持原数组的处理顺序。
示例:
输入:
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],按顺序拼接得到结果。
2. 解题思路
核心观察
- 每个数字的数位顺序需要保留,可通过数字取模+整除逆序取出数位,再整体反转列表恢复顺序;
- 也可通过字符串转换直接按字符顺序读取,更直观。
算法步骤
- 遍历数组中的每个数字;
- 逆序取出每个数字的所有数位(
num % 10取末位,num /= 10移除末位),存入列表; - 对列表整体反转,恢复数位的原始顺序;
- 将列表转换为
int[]并返回。
3. 代码实现
java
package lc2553;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Solution {
public int[] separateDigits(int[] nums) {
List<Integer> list = new ArrayList<>();
for (int i = nums.length - 1; i >= 0; i--) {
int num = nums[i];
while (true) {
list.add(num % 10);
if ((num /= 10) == 0) break;
}
}
Collections.reverse(list);
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
4. 代码优化说明
优化点1:字符串转换版(更简洁)
java
public int[] separateDigits(int[] nums) {
List<Integer> list = new ArrayList<>();
for (int num : nums) {
for (char c : String.valueOf(num).toCharArray()) {
list.add(c - '0');
}
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
优化点2:直接用数组计数(避免反转)
java
public int[] separateDigits(int[] nums) {
int count = 0;
for (int num : nums) {
count += String.valueOf(num).length();
}
int[] res = new int[count];
int idx = 0;
for (int num : nums) {
String s = String.valueOf(num);
for (char c : s.toCharArray()) {
res[idx++] = c - '0';
}
}
return res;
}
5. 复杂度分析
- 时间复杂度 :O(N×D)O(N \times D)O(N×D),其中 NNN 为数组长度,DDD 为数字的平均位数(最多10位,可视为常数)。
- 空间复杂度 :O(N×D)O(N \times D)O(N×D),存储结果列表的空间开销。
6. 总结
- 核心思路是数字数位提取 + 顺序恢复,两种主流实现方式(数字取模/字符串转换)均能高效完成任务;
- 关键技巧:数字取模法需通过整体反转恢复数位顺序,字符串转换法可直接按字符顺序读取,更直观;
- 本题为基础数组处理问题,重点考察数位提取和列表操作能力。