LeetCode 2553.分割数组中数字的数位:模拟(maybe+翻转)——java也O(1)

【LetMeFly】2553.分割数组中数字的数位:模拟(maybe+翻转)------java也O(1)

力扣题目链接:https://leetcode.cn/problems/separate-the-digits-in-an-array/

给你一个正整数数组 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 中的数字分割结果按照原数字在数组中的相同顺序排列。

示例 2:

复制代码
输入:nums = [7,1,3,9]
输出:[7,1,3,9]
解释:nums 中每个整数的分割是它自己。
answer = [7,1,3,9] 。

提示:

  • 1 <= nums.length <= 1000
  • 1 <= nums[i] <= 105

解题方法:模拟

怎样求出一个大于零的整数在十进制下的每一位?

当这个数( t t t)不为零的时候,不断取出这个数的个位( t % 10 t\%10 t%10),然后令这个数除以 10 10 10并向下取整就好了。

但是这样求出的结果是低位在前高位在后的,如 12 12 12我们按上述算法将会得到 2 , 1 2, 1 2,1。

因此我们不如来个将错就错,先求 n u m s nums nums最后一个元素,之后是倒数第二个,...,最后求 n u m s nums nums第一个元素。

这样我们就得到了一个完全逆向的答案数组,将这个数组原地reverse一下就好了。

时空复杂度分析

  • 时间复杂度 O ( l e n ( n u m s ) × log ⁡ n u m s i ) O(len(nums)\times \log numsi) O(len(nums)×lognumsi)
  • 空间复杂度 O ( 1 ) O(1) O(1),力扣返回值不计入算法空间复杂度

至于Java这种不可变长度数组的编程语言,若不想使用可变数组List把空间复杂度搞到 O ( n ) O(n) O(n),也可以dry run一次(只计算需要的长度不真的放入数组),然后再申请对应长度的int[]。

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2026-05-11 21:16:38
 */
class Solution {
public:
    vector<int> separateDigits(vector<int>& nums) {
        vector<int> ans;
        for (int i = nums.size() - 1; i >= 0; i--) {
            while (nums[i]) {
                ans.push_back(nums[i] % 10);
                nums[i] /= 10;
            }
        }
        reverse(ans.begin(), ans.end());
        return ans;
    }
};
Python
python 复制代码
'''
LastEditTime: 2026-05-11 21:20:12
'''
from typing import List

class Solution:
    def separateDigits(self, nums: List[int]) -> List[int]:
        ans = []
        for x in reversed(nums):
            while x:
                ans.append(x % 10)
                x //= 10
        ans.reverse()
        return ans
Java
java 复制代码
/*
 * @LastEditTime: 2026-05-11 21:32:57
 */
class Solution {
    public int[] separateDigits(int[] nums) {
        int cnt = 0;
        for (int t : nums) {
            while (t > 0) {
                cnt++;
                t /= 10;
            }
        }

        int[] ans = new int[cnt];
        for (int i = nums.length - 1, idx = cnt - 1; i >= 0; i--) {
            while (nums[i] > 0) {
                ans[idx--] = nums[i] % 10;
                nums[i] /= 10;
            }
        }

        return ans;
    }
}
Go
go 复制代码
/*
 * @LastEditTime: 2026-05-11 21:22:04
 */
package main

import "slices"

func separateDigits(nums []int) (ans []int) {
    for _, x := range slices.Backward(nums) {
        for x > 0 {
            ans = append(ans, x % 10)
            x /= 10
        }
    }
    slices.Reverse(ans)
    return
}
Rust
rust 复制代码
/*
 * @LastEditTime: 2026-05-11 21:35:16
 */
impl Solution {
    pub fn separate_digits(mut nums: Vec<i32>) -> Vec<i32> {
        let mut ans = Vec::new();
        for i in (0..nums.len()).rev() {
            while nums[i] != 0 {
                ans.push(nums[i] % 10);
                nums[i] /= 10;
            }
        }
        ans.reverse();
        ans
    }
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
松仔log35 分钟前
Kotlin中级——callbackFlow
java·前端·kotlin
知守观1 小时前
同一个团队两套分包:DDD 四层落地后,domain 层最大的类还是 5885 行
java·后端·领域驱动设计
Oneshot1 小时前
DLX(Dancing Links)算法详解:求解数独最快的算法
算法
文丑颜不良啊1 小时前
LeetCode2541~2560题目解析
java·leetcode
瑞雪兆丰年兮2 小时前
JavaWeb-day11-SpringBootWeb案例(文件上传)
java·运维·服务器·javaweb·oss
青少儿编程课堂2 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
kongdong2 小时前
Hikyuu | RSI均值回归交易策略实现
算法·均值算法·回归·量化交易·交易策略·hikyuu
Highcharts.js2 小时前
Highcharts智能数据分析平台Orbit 多语言配置技术文档
java·前端·javascript·highcharts·orbit·智能数据分析·设置文档
Rain的Java大神之路2 小时前
设计一套生产级 API 接口:从契约、安全、幂等到限流,我踩过的坑都在这了
java·后端·面试
小王C语言2 小时前
优选算法:分治-归并排序
算法