首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >2026-02-24:计算十进制表示。用go语言,给定一个正整数 n。把能写成 d×10^k(其中 d 是 1 到 9 的整数,k 是非负整数)的正整数称为“十

2026-02-24:计算十进制表示。用go语言,给定一个正整数 n。把能写成 d×10^k(其中 d 是 1 到 9 的整数,k 是非负整数)的正整数称为“十

作者头像
福大大架构师每日一题
发布2026-03-04 17:20:40
发布2026-03-04 17:20:40
180
举报

2026-02-24:计算十进制表示。用go语言,给定一个正整数 n。把能写成 d×10^k(其中 d 是 1 到 9 的整数,k 是非负整数)的正整数称为“十位分量”——等价于十进制表示里只有一位非零数字。例如 500、30、7 符合这一形式,而 537、102、11 不符合。

要求把 n 拆成若干个这样的十位分量之和,且所用分量的数量尽可能少。输出这些分量组成的数组,并按数值从大到小排序。

1 <= n <= 1000000000。

输入:n = 537。

输出:[500,30,7]。

解释:

我们可以将 537 表示为500 + 30 + 7。无法用少于 3 个 10 进制分量表示 537。

题目来自力扣3697。

一、整体解题思路分步解析

我们以输入 n = 537 为例,逐步拆解代码的执行逻辑,核心目标是把数字拆成最少的“十位分量”(仅一位非零的数)并降序排列:

步骤1:初始化关键变量

函数 decimalRepresentation 接收参数 n = 537 后,首先做两件事:

  • • 定义返回值 ans(切片类型),用于存储最终的十位分量;
  • • 定义变量 pow10 并初始化为 1,这个变量用于计算当前位的“位权”(即 10^k,k从0开始,对应个位、十位、百位等)。

步骤2:循环拆解每一位数字(核心逻辑)

进入 for 循环,循环条件是 n > 0,每次循环会完成“取当前最低位→判断是否有效→计算十位分量→更新n和位权”的操作,具体过程如下:

循环次数

初始n值

执行操作

执行后n值

pow10值

ans切片变化

第1次

537

1. 取最低位:d = 537 % 10 = 72. d>0,计算分量:7×1=7,加入ans3. n = 537 / 10 = 534. pow10 = 1×10 = 10

53

10

[7]

第2次

53

1. 取最低位:d = 53 % 10 = 32. d>0,计算分量:3×10=30,加入ans3. n = 53 / 10 = 54. pow10 = 10×10 = 100

5

100

[7, 30]

第3次

5

1. 取最低位:d = 5 % 10 = 52. d>0,计算分量:5×100=500,加入ans3. n = 5 / 10 = 04. pow10 = 100×10 = 1000

0

1000

[7, 30, 500]

结束

0

循环条件n>0不满足,退出循环

-

-

-

注:循环中“d>0”的判断是为了跳过数字中的0位(比如n=507时,十位的0会被跳过,不会生成0×10=0这样的无效分量)。

步骤3:反转切片实现降序排序

循环结束后,ans切片中的元素是 [7, 30, 500],而题目要求按数值从大到小排序,因此调用 slices.Reverse(ans) 反转切片,得到 [500, 30, 7]

步骤4:返回结果并输出

函数返回处理后的ans切片,main函数接收结果后打印,最终输出 [500 30 7],符合题目要求。

二、时间复杂度与空间复杂度分析

1. 时间复杂度

  • • 循环次数:取决于输入n的十进制位数,设n的位数为k(比如537是3位,k=3;1000000000是10位,k=10),循环会执行k次,时间复杂度为O(k);
  • • 反转切片:slices.Reverse 是原地反转,时间复杂度为O(k)(k为切片长度,等于n的非零位数,最多等于k);
  • • 总时间复杂度:O(k) + O(k) = O(k)。由于n的范围是1≤n≤10^9,k最大为10(固定常数),因此实际时间复杂度为O(1)(常数时间)

2. 额外空间复杂度

  • • 变量开销:pow10dn(函数内的副本)等都是单个整型变量,空间开销为O(1);
  • • 切片ans:存储的元素数量等于n的非零位数(比如537有3个非零位,ans长度为3;n=507有2个非零位,ans长度为2),最多为10个元素(n=10^9时是1个元素),因此切片的额外空间开销为O(k);
  • • 总额外空间复杂度:O(1) + O(k) = O(k),同样因为k最大为10(固定常数),实际额外空间复杂度为O(1)(常数空间)

总结

  1. 1. 核心过程:先逐位拆解数字,提取非零位并计算对应的十位分量,再反转切片实现降序,最终得到最少数量的十位分量数组;
  2. 2. 时间复杂度:O(1)(因n的位数最多10位,属于常数级);
  3. 3. 额外空间复杂度:O(1)(存储结果的切片长度最多10,无额外冗余空间)。

Go完整代码如下:

.

代码语言:javascript
复制
package main

import (
    "fmt"
    "slices"
)

func decimalRepresentation(n int) (ans []int) {
    pow10 := 1
    for ; n > 0; n /= 10 {
        d := n % 10
        if d > 0 {
            ans = append(ans, d*pow10)
        }
        pow10 *= 10
    }
    slices.Reverse(ans)
    return
}

func main() {
    n := 537
    result := decimalRepresentation(n)
    fmt.Println(result)
}
在这里插入图片描述
在这里插入图片描述

Python完整代码如下:

.

代码语言:javascript
复制
# -*-coding:utf-8-*-

def decimal_representation(n: int) -> list[int]:
    """
    将整数拆分为十进制位值表示
    
    例如: 537 -> [500, 30, 7]
    """
    ans = []
    pow10 = 1
    
    while n > 0:
        d = n % 10  # 获取最后一位数字
        if d > 0:
            ans.append(d * pow10)
        n //= 10    # 去掉最后一位
        pow10 *= 10
    
    ans.reverse()
    return ans

if __name__ == "__main__":
    n = 537
    result = decimal_representation(n)
    print(result)
在这里插入图片描述
在这里插入图片描述

C++完整代码如下:

.

代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <algorithm>

std::vector<int> decimalRepresentation(int n) {
    std::vector<int> ans;
    int pow10 = 1;

    while (n > 0) {
        int d = n % 10;  // 获取最后一位数字
        if (d > 0) {
            ans.push_back(d * pow10);
        }
        n /= 10;         // 去掉最后一位
        pow10 *= 10;
    }

    std::reverse(ans.begin(), ans.end());
    return ans;
}

int main() {
    int n = 537;
    std::vector<int> result = decimalRepresentation(n);

    // 打印结果
    std::cout << "[";
    for (size_t i = 0; i < result.size(); ++i) {
        std::cout << result[i];
        if (i < result.size() - 1) {
            std::cout << ", ";
        }
    }
    std::cout << "]" << std::endl;

    return0;
}
在这里插入图片描述
在这里插入图片描述

·


我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

·

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、整体解题思路分步解析
    • 步骤1:初始化关键变量
    • 步骤2:循环拆解每一位数字(核心逻辑)
    • 步骤3:反转切片实现降序排序
    • 步骤4:返回结果并输出
  • 二、时间复杂度与空间复杂度分析
    • 1. 时间复杂度
    • 2. 额外空间复杂度
  • 总结
  • Go完整代码如下:
  • Python完整代码如下:
  • C++完整代码如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档