ruby - 编码挑战

标签 ruby algorithm

所以,最近我正在检查一项编码挑战。这个问题很有趣所以只是想知道在时间和空间复杂性方面是否有更好的方法来做到这一点。

问题:给定一个数字 x,其中 x 将是 > 0 的正数。找到具有相同位数的最接近的最小数字。如果存在则返回最小的数字,否则打印“最近的最小数字不存在”。 相同位数 的意思是,如果数字为 12345,那么使用这些位数(在本例中,位数为 5),您将无法找到最接近的较小数字。虽然你可以说它可以是 1234 但它不是相同的位数。在找到最近的最小数字时,您需要使用所有数字

所以,下面是几个例子

人数:8563 输出:8536

编号 7385 输出 7358

数量:3857 输出:3785

数量:123 输出:最近的最小数不存在

number = gets.to_i
flag = 1
numbers_array =  number.digits.permutation(Math.log10(number).to_i + 1).sort
numbers_array.each_with_index do |e, index| 
  if e.join.to_i == number
    print numbers_array[index - 1]
    flag = 0
    break
  end
end
if flag == 1
  puts "Nearest Smallest Number not exist"
end

注意:当数字很大时,上述解决方案会花费更多时间

最佳答案

检查以下内容,

def lowest_digit(n)
    digits, index = n.to_s.chars, nil
    str = digits.reverse
    z = str[1..-1].each_with_index.inject([str[0]]) { |m,(a,i)| m << a; index = i if a > m[-2]; break m if a > m[-2]; m }
    z_num = z.reverse.join
    if digits.reverse == z
      "Nearest Smallest Number not exist"
    else
      digits[0..(-3-index)].join + z.permutation(z.length).to_a.map(&:join).select { |x| x < z_num }.max
    end
end

lowest_digit 32964563245279143273348345
 => "32964563245279143273345843"

关于ruby - 编码挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58444393/

相关文章:

ruby - 专有或 ruby 的关键字?

ruby - 第一次在 Ruby 循环中做一些特别的事情

java - 这个 C++ 函数与等效的 java 函数有何不同?

algorithm - 使用 2^n 步来获得房间中每个可能的人组合

ruby-on-rails - ApplicationMailer 默认来自标题而不是电子邮件地址?

Ruby TCPSocket 读取直到自定义终止符

c# - 如何显示变量的公式

algorithm - 使用时差 (TDOA) 对信号进行三边测量

algorithm - Kotlin - 从数组中删除重复字符串的惯用方法?

android - 如何验证复选框是否为 ImageView