LeetCode 6303. 分割数组中数字的数位
给你一个正整数数组 nums ,请你返回一个数组 answer ,你需要将 nums 中每个整数进行数位分割后,按照 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 中的数字分割结果按照原数字在数组中的相同顺序排列。
1 <= nums.length <= 1000
1 <= nums[i] <= 105
解法一:用栈存放每个数字的数位,然后将其加入结果数组:
class Solution {
public:
vector<int> separateDigits(vector<int>& nums) {
stack<int> is;
vector<int> ans;
for (int i : nums) {
while (i) {
is.push(i % 10);
i /= 10;
}
while (!is.empty()) {
ans.push_back(is.top());
is.pop();
}
}
return ans;
}
};
如果输入数组nums的长度为n,nums数组中最大数字为m,此算法时间复杂度为O(nlgm),空间复杂度为O(lgm)。
解法二:在解法一的基础上,如果我们手动倒置每个数字在结果数组中的位数,则只需常数空间了:
class Solution {
public:
vector<int> separateDigits(vector<int>& nums) {
vector<int> ans;
for (int i : nums) {
int numDigitNum = 0;
while (i) {
ans.push_back(i % 10);
i /= 10;
++numDigitNum;
}
int loopNum = numDigitNum / 2;
int sz = ans.size();
while (loopNum) {
swap(ans[sz - loopNum], ans[sz - numDigitNum + loopNum - 1]);
--loopNum;
}
}
return ans;
}
};
如果输入数组nums的长度为n,nums数组中最大数字为m,此算法时间复杂度为O(nlgm),空间复杂度为O(1)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)