ruby 反向整数位数

fnvucqvd  于 2023-03-17  发布在  Ruby
关注(0)|答案(7)|浏览(149)

我试着把一个整数的数字取反:123456 => 654321,我能想到的最好的解决方案是123456.to_s.reverse.to_i。我觉得这太多代码了。有人有比这更好的方法吗?

xfyts7mz

xfyts7mz1#

这是一个非常“代码高尔夫”式的回答,我不建议用真实的的代码来编写...
但是,您可以使用以下语句将答案中的一个字符去掉:

123456.to_s.reverse.to_i
123456.digits.join.to_i

或者(同样,仅作为一个“代码高尔夫”答案!!)如果您很高兴最终使用String而不是Integer,您可以使用以下方法使其更加合理:

123456.digits*''  #=> "654321"

事实上,转换为字符串可能更可取,因为它可以防止丢失零而丢失信息。撇开代码高尔夫的答案不谈,比较一下:

43210.to_s.reverse #=> "01234"
43210.to_s.reverse.to_i #=> 1234
zdwk9cvp

zdwk9cvp2#

下面是另一种不转换字符串的方法......

x = 12345
y = 0

while x > 0 do
    y = y*10
    y = y + (x%10)
    x = x/10 

  puts y      
end

这个算法也可以在很多面试中被问到......不管你使用哪种语言......这个逻辑都是一样的。上面的例子使用了Ruby

kkih6yb8

kkih6yb83#

我们可以在对象级别实现这一点,如下所示。

class Integer
  def reverse
    number = self
    reversed = 0
    reversed, number = (reversed*10 + number % 10), number / 10 until number == 0
    reversed
  end
end

p 1234.reverse => 4321
nuypyhwy

nuypyhwy4#

我认为一般来说只有两种方法可以达到这个目的:
1.

n = whatever
result = 0
while n > 0
  d, m = n.divmod(10)
  result = result * 10 + m
  n = d
end

2.转换为str,反转,再转换回来(您已经完成了)。
计算机内存是二进制的,所以它不知道十进制(我希望这是正确的词)数字,所以你需要“介绍”他们。

lrl1mhuk

lrl1mhuk5#

下面是一个快速的一行程序,介绍各种正整数在线竞赛:

number = 123456778
p 0.then { |ch|  (number./(10).tap { |x| ch, number = ch * 10 + (number - x  * 10), x } while (number > 0)) || ch }

但这是不可读的。要使它可读:

#!/usr/bin/ruby -w

number = 123

ch = 0

while (number > 0)
    div = number / 10
    mod = number - div  * 10

    ch = ch * 10 + mod
    number = div
end

p ch

处理负整数:

#!/usr/bin/ruby -w

number = -123

ch = 0

negative = number < 0
number *= -1 if negative

while (number > 0)
    div = number / 10
    mod = number - div  * 10

    ch = ch * 10 + mod
    number = div
end

ch *= -1 if negative

p ch

使用Kernel#then()Kernel#tap()还可以使您将其写在一行中,这是最难看的方式。

1tu0hz3e

1tu0hz3e6#

比较2种溶液。

# @param {Integer} x
# @return {Integer}
def reverse1(x)
  x.to_s.reverse.to_i
end

# @param {Integer} x
# @return {Integer}
def reverse2(x)
  rev = 0
  while x != 0
    pop = x.remainder(10)
    x /= 10
    rev = rev * 10 + pop
  end

  rev
end

# ********************#
#     Benchmark       #
# ********************#

require "benchmark"

x = 12320238
Benchmark.bm do |bm|
  bm.report("reverse1: ") { reverse1(x) }
  bm.report("reverse2: ") { reverse2(x) }
end

# user     system      total        real
# reverse:   0.000010   0.000003   0.000013 (  0.000009)
# reverse1:   0.000017   0.000005   0.000022 (  0.000021)
kzmpq1sx

kzmpq1sx7#

在Javascript中将整数的数字反转

溶液

var reverse = function(x) {
  let result = 0
  while (x) {
    result = result * 10 + x % 10
    x = x / 10 | 0
  }
  return Math.abs(result) > 2147483647 ? 0 : result
};

输入示例

console.log(reverse(-1254))

输出

-4521

相关问题