sicily 1544 Integer Generator

数位

题意:
给你一个数位系统(0到9),然后给你一个数串.判断其是否合法(含有数位系统没有的字符即是不合法,或者有前导0).
如果合法的话,输出其这个数串在这个数位系统的下一个数串

数据范围:
数位系统size<=10
数串长度未知

思路:

判断合不合法很容易,关键是这个下一个子串是怎么理解.

样例给了很多提示,数位系统是1,数串是1.那答案是11.如果按一进制去理解,1和11应该是同一个东西

还有,数位系统是987654321,数串是999,下一个居然是1000,而不是998,也就是说数位系统每个字符的权值是按照1到9这样.所以我们应该这样理解,数串在数位系统的排列,是以长度为第一关键字,以字典序为第二关键.并且如果数位系统含有0,那么长度要变长的时候,将添加次小的字符,像999变成1000.(如果数位系统只有0怎么办,这样的话数串肯定是不合法,要么有前导0,要么有数位系统没有的字符,到这里才明白这题为什么要这样出)

算法过程可以这样.先对数位系统从新排序,然后从后往前扫数串,如果发现不是最大的字符的话,就把它变成当前字符的下一个字符,然后后面的全部置为最小的字符.如果找不到,那么全部的字符也变成最小的字符,然后在前面添加一个最小的字符,如果最小的字符是0,那么添加次小的字符

总结:从后往前扫,把最大字符的为置为最小字符,出现非最大字符则+1,退出循环.全部为最大则在最前面添加一个最小非零的字符


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值