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)。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值