加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 从列表中生成从n到m的数字

发布时间:2020-12-16 22:59:37 所属栏目:百科 来源:网络整理
导读:我将从一个例子开始;给定n = 1且m = 100且列表为[1,2,3] 生成包含1位和2位数的所有数字,依此类推但在这种情况下它们需要小于100. 输出: – 1,3,11,12,13,21,22,23,31,32,33 然后我们停下来,因为下一个数字将超过100,例如: – 111,112,113,121,122,123,131,
我将从一个例子开始;给定n = 1且m = 100且列表为[1,2,3]
生成包含1位和2位数的所有数字,依此类推但在这种情况下它们需要小于100.

输出:

– 1,3,11,12,13,21,22,23,31,32,33

然后我们停下来,因为下一个数字将超过100,例如:

– 111,112,113,121,122,123,131,132,133,21 ..,. 22 ……,23 ……,33

正如你所注意到我将1,4附加到之前创建的数字上,为了做到这一点,我使用了一个递归函数,它在我的列表中的每个数字的for循环中启动,它们运行直到生成数字大于我的限制.

def x(str,finish,d,c) 
  return if d >= finish
  [1,4].each do |e|
    x(str,end,d*c+e)
  end

  # do something if d >= str
end

如果我需要从1开始,这可以正常工作,但如果我的起始数字要大很多,我仍然需要开始创建这个序列.

有人可以帮我一个产生相同序列的解决方案,但是从任何起点而不是1,所以如果例如起点是100和结束200那么输出将是:

111,114,124,132 […]

任何编程语言的解决方案都不错,但请不要内置核心库.

解决方法

您可以从“右”(最低有效数字)到“左”(最高有效数字),继续跟踪两个值:

> min,与您到目前为止处理的数字位数相同的最小有效整数.因此,例如,如果您处理了尾随27,则最小有效两位数整数为11.
> max,与您到目前为止处理的数字位数相同的最小有效整数,大于或等于您目前处理的数字.因此,那么大于或等于27的最小有效两位数整数是31.

>请注意,max不会总是存在.例如,没有大于或等于70的有效两位数整数.

您需要min的原因是,如果您遇到的数字不在您允许的数字列表中,那么新的最大值将包含前一个min而不是之前的最大值. (例如,大于或等于02的最小有效两位数整数是11,而不是12.)

最后,如果存在,则返回max;否则,你返回min,但在你的列表前面加上最少的数字.

例如,如果this.allowedDigits是允许数字的集合,那么我们可以编写(在Java中):

private Integer getAllowedDigitGreaterThanOrEqualTo(final int digit) {
    for (int result = digit; result < 10; ++result) {
        if (this.allowedDigits.contains(result)) {
            return result;
        }
    }
    // digit is bigger than anything in the list:
    return null;
}

private int getAllowedNumberGreaterThanOrEqualTo(int n) {
    int minResult = 0;
    Integer maxResult = 0;
    int powerOfTen = 1;
    while (n > 0) {
        final int digit = n % 10;
        n /= 10;
        minResult = getAllowedDigitGreaterThanOrEqualTo(0) * powerOfTen + minResult;
        if (maxResult != null && this.allowedDigits.contains(digit)) {
            maxResult = digit * powerOfTen + maxResult;
        } else {
            final Integer newDigit = getAllowedDigitGreaterThanOrEqualTo(digit + 1);
            if (newDigit == null) {
                maxResult = null;
            } else {
                maxResult = newDigit * powerOfTen + minResult;
            }
        }
        powerOfTen *= 10;
    }
    if (maxResult == null) {
        return getAllowedDigitGreaterThanOrEqualTo(1) * powerOfTen + minResult;
    } else {
        return maxResult;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读