news 2026/7/6 14:49:01

题解:学而思编程 数位排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
题解:学而思编程 数位排序

【题目来源】

学而思编程:数位排序

【题目描述】

小猴对一个数的数位之和很感兴趣,今天他要按照数位之和给序列a 1 , a 2 , … , a n a_1,a_2,\dots,a_na1,a2,,an排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面,保证所有整数互不相同。

例如,1001 10011001排在99 9999前面,因为1001 10011001的数位之和是2 22,而99 9999的数位之和18 1818

又如,2 22排在101 101101前面,因为它们的数位之和相同,而2 22小于101 101101

请你帮助小猴完成这个任务。

【输入】

第一行,包含一个正整数n nn

第二行,包含n nn个正整数a 1 , a 2 , … , a n a_1,a_2,\dots,a_na1,a2,,an

【输出】

一行,空格隔开的n nn个整数,表示排序之后的序列。

【输入样例】

5 2 4 1 5 3

【输出样例】

1 2 3 4 5

【核心思想】

  1. 问题分析:给定n nn个互不相同的正整数,要求按数位和升序排序,数位和相同时按数值大小升序排序。这是一个自定义排序问题,关键在于设计比较函数,先比较数位和,再比较原数值。

  2. 算法选择

    • 数位和计算:通过取模和除法逐位求和
    • 自定义比较函数cmp(x, y)先比较cal(x)cal(y),相等时比较xy
    • 标准排序:使用sort配合自定义比较函数
  3. 关键步骤

    • 初始化:读取n nn和数组a [ 1.. n ] a[1..n]a[1..n]
    • 数位和函数cal(x)
      • sum = 0
      • x > 0时循环:
        • sum += x % 10:累加末位数字
        • x /= 10:去掉末位
      • 返回sum
    • 自定义比较函数cmp(x, y)
      • cal(x) != cal(y):返回cal(x) < cal(y)(数位和小的排前面)
      • 否则:返回x < y(数位和相等时,数值小的排前面)
    • 排序并输出
      • sort(a + 1, a + n + 1, cmp):按自定义规则排序
      • 输出排序后的数组
  4. 时间/空间复杂度

    • 时间复杂度:O ( n log ⁡ n × d ) O(n \log n \times d)O(nlogn×d)d dd为数字位数(数位和计算),排序O ( n log ⁡ n ) O(n \log n)O(nlogn),每次比较O ( d ) O(d)O(d)
    • 空间复杂度:O ( n ) O(n)O(n),存储数组
  5. 自定义排序的核心思想

    • 多级排序键:第一关键字为数位和,第二关键字为原数值,比较函数按优先级依次判断
    • 稳定排序替代:若使用稳定排序,可先按数值排序,再按数位和排序;但自定义比较函数更直接高效
    • 数位和计算:利用十进制特性,通过%10/10逐位分离,适用于任意正整数
    • 互异性保证:题目保证所有整数互不相同,避免了相等元素时的排序歧义
    • 适用于"多关键字排序"类问题,自定义比较函数是 C++ 中实现复杂排序规则的标准方法

【解题思路】

【算法标签】

#其他排序

【代码详解】

#include<bits/stdc++.h>usingnamespacestd;intn,a[100005];intcal(intx)// 计算数位和{intsum=0;while(x>0){sum+=x%10;x/=10;}returnsum;}boolcmp(intx,inty){if(cal(x)!=cal(y)){// 数位和不同时returncal(x)<cal(y);// 小的排前面}returnx<y;// 否则数值小的排前面}intmain(){cin>>n;for(inti=1;i<=n;i++)cin>>a[i];// 输入n个数sort(a+1,a+n+1,cmp);// 按照自定义方式排序for(inti=1;i<=n;i++)cout<<a[i]<<" ";return0;}

【运行结果】

5 2 4 1 5 3 1 2 3 4 5
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 14:48:02

如何高效配置开源数控系统:LinuxCNC实战指南与最佳实践

如何高效配置开源数控系统&#xff1a;LinuxCNC实战指南与最佳实践 【免费下载链接】linuxcnc LinuxCNC controls CNC machines. It can drive milling machines, lathes, 3d printers, laser cutters, plasma cutters, robot arms, hexapods, and more. 项目地址: https://g…

作者头像 李华
网站建设 2026/7/6 14:46:32

YOLOv10模型改进-特定领域应用-第96篇:YOLOv10改进策略【特定领域应用】| YOLOv10在无人机巡检中的应用

一、本文介绍 本文记录的是YOLOv10在无人机巡检领域的应用。无人机巡检需要检测电力设施、道路状况、建筑物损伤等目标&#xff0c;YOLOv10凭借其高效的推理速度和准确的检测能力&#xff0c;成为无人机巡检领域的首选目标检测算法。 二、无人机巡检场景分析 2.1 检测目标 无人…

作者头像 李华
网站建设 2026/7/6 14:45:07

【QT】国产化编译指南7

qt-everywhere-opensource5.12.6.zip与.tar.xz的区别qt-everywhere-opensource-src-5.12.6.zip 和 qt-everywhere-opensource-src-5.12.6.tar.xz 是 Qt 5.12.6 开源完整源码包的两种不同压缩格式&#xff0c;核心内容&#xff08;源码文件&#xff09;完全一致&#xff0c;主要…

作者头像 李华
网站建设 2026/7/6 14:45:02

【QT】国产化编译指南8

银河麒麟高级服务器操作系统V10&#xff08;Kylin Linux Advanced Server V10&#xff09;的x86结构和arm架构分别可以用哪个版本的qt包银河麒麟高级服务器操作系统 V10&#xff08;Kylin Linux Advanced Server V10&#xff09;不同架构适用的 Qt 包版本如下&#xff1a;x86_6…

作者头像 李华
网站建设 2026/7/6 14:35:18

TVA对具身智能领域“莫拉维克悖论“的挑战(16)

前沿技术介绍&#xff1a;AI智能体视觉&#xff08;TVA&#xff0c;Transformer-based Vision Agent&#xff09;是依托Transformer架构与“因式智能体”理论所构建的颠覆性工业视觉技术&#xff0c;属于“物理AI” 领域的一种全新技术形态&#xff0c;完成了从“虚拟世界”到“…

作者头像 李华
网站建设 2026/7/6 14:34:46

npm Registry 包版本历史采集:用 Python 构建“版本时间线”数据表

㊗️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~ ㊙️本期爬虫难度指数:⭐⭐⭐☆☆(进阶级) 🉐福利: 一次订阅后,专栏内的所有文章可永久免费看,持续更新中,保底1000+(篇)硬核实战内容。 全文目录: 🌟…

作者头像 李华