所以,最近我正在检查一项编码挑战。这个问题很有趣所以只是想知道在时间和空间复杂性方面是否有更好的方法来做到这一点。
问题:给定一个数字 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/