数位排序 问题

蓝桥杯 | 数位排序 问题 | python

问题描述
小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当两个数各个数位之和不同时, 将数位和较小的排在前面,当数位之和相等时, 将数值小的排在前面。
例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位之和 13 。
又如, 6 排在 2022 前面, 因为它们的数位之和相同, 而 6 小于 2022 。
给定正整数 n,m,请问对 1 到 n 采用这种方法排序时, 排在第 m 个的元素是多少?
输入格式
输入第一行包含一个正整数 n 。
第二行包含一个正整数 m 。
输出格式
输出一行包含一个整数, 表示答案。
样例输入
13
5
样例输出
3
样例说明
1 到 13 的排序为:
1,10,2,11,3,12,4,13,5,6,7,8,9 。第 5 个数为 3。
评测用例规模与约定
对于 30% 的评测用例,1≤m≤n≤300 。
对于 50% 的评测用例,1≤m≤n≤1000 。
对于所有评测用例,1≤m≤n≤10**6 。
运行限制
最大运行时间:3s
最大运行内存: 512M

  1. 官方题解
import os
import sys

# 请在此输入您的代码
'''
对于数字 1−n,先求出每个数字的数位之和
根据每个数字的数位之和自定义排序函数即可
利用 list.sort() 函数中的 key 参数进行优先级排序
数位之和优先排序,相同数位之和对数字进行排序
'''
n=eval(input())
m=eval(input())
a=[i for i in range(1,n+1)]     # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
b=[0]*(n+1)                     # 加上第0位元素共n+1位
for i in range(1,n+1):
    # 求i的数位之和
    num=i
    while num!=0:
        b[i]+=num%10            # 1的数位之和赋值给b[1]
        num//=10
# print(b)                      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4]
'''
list.sort(key=None,reverse=False)
key:对列表按键值排序(每个数字对应的数位之和)
reverse:排序规则,reverse=True 降序,reverse=False 升序(默认)
'''
a.sort(key=lambda x:(b[x]))     # 对任一x,将x对应b[]中的数位和作为排序键值
'''
lambda arg1,arg2,...:expression
arg1,arg2,...:输入参数
expression:输入参数的表达式
'''
# print(a)                      [1, 10, 2, 11, 3, 12, 4, 13, 5, 6, 7, 8, 9]
print(a[m-1])                   # 输出排在第m个的元素
  1. 其他题解 ①
import os
import sys

# 请在此输入您的代码
n=int(input())
m=int(input())
a=list(range(1,n+1))
a.sort(key=lambda x:sum(int(i) for i in str(x)))    # 按数位和作为键值排序
print(a[m-1])
  1. 其他题解 ②
import os
import sys

# 请在此输入您的代码
n=int(input())                      # n=13
m=int(input())                      # m=5
twodiml=[(0,0)]                     # 二维列表,元素是(i的数位和,i)
# 求x的数位和
def nbsum(x):
    sum=0
    while x:
        sum+=x%10
        x//=10
    return sum
for i in range(1,n+1):              # 1到n求数位和
    twodiml.append((nbsum(i),i))
'''
print(twodiml)
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6),
 (7, 7), (8, 8), (9, 9), (1, 10), (2, 11), (3, 12), (4, 13)]
'''
twodiml.sort()
'''
print(twodiml)
[(0, 0), (1, 1), (1, 10), (2, 2), (2, 11), (3, 3), (3, 12),
 (4, 4), (4, 13), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]
'''
print(twodiml[m][1])                # 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值