求生成含输入数字n相同数字的随机数数组的实现思路
实现思路拆解
嘿,这个需求挺有意思的,我来分享几个实用的实现思路,拆解开来看其实不难:
1. 先把核心约束理清楚
首先得明确两个关键前提:
- 你输入的数字
n:这里要先搞清楚是需要覆盖n的所有不同数字(比如n=11452,只要生成的数里有1、2、4、5就行),还是必须包含n的每一位数字(包括重复次数)(比如n=11452,生成的数里至少要有2个1,1个2、4、5)。你的例子里生成了221545(只有1个1),我先按两种情况都说明。 - 指定范围:比如生成的数要在
[min, max]之间,得先确定这个范围对应的数字位数,避免做无用功。
2. 先提取n的数字特征
这一步是基础,把n转换成字符串后处理:
- 如果是覆盖所有不同数字:提取去重后的数字集合,比如n=11452就得到
{'1','2','4','5'}。 - 如果是满足重复次数要求:统计每个数字的出现次数,比如n=11452就得到
{'1':2, '2':1, '4':1, '5':1},生成的数里每个数字的出现次数不能少于这个值。
3. 两种可行的实现思路
思路一:构造法(高效优先)
这种方法先满足约束再补全,比瞎碰效率高多了:
- 第一步:先看指定范围的数字位数,比如范围是1000-9999,那就是4位数。
- 第二步:先搭好满足约束的基础框架:
- 要是只需要覆盖不同数字:如果n的不同数字有k个,只要k不超过目标位数,先把这k个数字都放进序列里,剩下的位置从n的数字集合里随机选就行。
- 要是要满足重复次数:先把n的所有数字(按重复次数)都放进序列,比如n是11452(5位),目标是6位数的话,先放1、1、4、5、2,剩下1个位置从n的数字里随便选。
- 第三步:把这个序列打乱顺序转成整数,检查是否在指定范围内,不在的话就重新构造(或者调整补全的数字)。
- 第四步:重复上面的步骤,直到凑够你需要的数组长度。
思路二:随机生成+校验(简单直接)
如果指定范围不大,这种方法写起来最快:
- 第一步:在指定范围内随便生成一个整数。
- 第二步:把这个数转成字符串,检查是否符合要求:
- 覆盖不同数字的话,就看n的所有不同数字是不是都在这个字符串里。
- 满足重复次数的话,就统计这个字符串里每个数字的出现次数,是不是都大于等于n里对应数字的次数。
- 第三步:符合要求就放进数组,不符合就重新生成。
- 第四步:重复直到数组达标。
4. 一些优化小技巧
- 如果指定范围特别大,优先用思路一,思路二可能会生成一大堆不符合条件的数,浪费时间。
- 如果需要生成不重复的数组,可以用个集合存已经生成的数,避免重复。
- 可以先预判一下,如果n的不同数字数量比范围里的最大位数还多,那直接返回空数组就行——根本不可能生成符合条件的数。
内容的提问来源于stack exchange,提问作者D.D
相关产品推荐
相关产品推荐

