2016-07-11 113 views
1

对于一项任务,我需要编写一个名为get_integer_from_string的方法,将输入字符串转换为整数。 我已经完成了,但对于一个要求:我可以用什么来代替char.to_i?

  • 请不要使用隐式或自动类型转换来解决这个问题 ,在C Python中即的atoi(),INT(),如parseInt函数功能( ) Java或PHP中
  • INTVAL()

我可以代替char.to_i在我下面的代码,以满足这一要求?

def get_integer_from_string(str, based=7) 
    return 0 if (/^(?<num>\d+)$/ =~ str).nil? 
    result = 0 
    str.reverse.each_char.with_index do |char, index| 
    tmp = char.to_i * based**index 
    result += tmp 
    end 
    result rescue 0 
end 
+0

可能'基地'比10更大, 16? – mudasobwa

回答

3

我怀疑你是否过度这个。由于char只能是十个不同的串一个,只是做一个查找表散列:

C_TO_I = { 
    "0" => 0, "1" => 1, "2" => 2, "3" => 3, 
    "4" => 4, "5" => 5, "6" => 6, "7" => 7, 
    "8" => 8, "9" => 9 
} 

然后只是C_TO_I[char]取代char.to_i在你的代码。为了证明:

char = "7" 
p C_TO_I[char] 
# => 7 
+1

'('0'..'9')。map.with_index {| v,i | [v,i]} .to_h' – mudasobwa

+0

@mudasobwa所以它会像这样'code'def get_integer_from_string(str,based = 7) 如果返回0(/ ^(? \ d +)$/=〜str)。零? result = 0 str.reverse.each_char.with_index do | char,index | tmp = to -h * based ** index result + = tmp end result rescue 0 end –

+0

@AdelAlmaleh这个问题最好写给这个答案的作者;我会重新执行'to_i'(请参阅我的回答),这对于不寻常的基础更安全。 – mudasobwa

1
def my_to_i input, base 
    ('0'...input).count.tap do |i| 
    raise ArgumentError, 'Incorrect value in input' if i >= base || i < 0 
    end 
end 

在这里,我们重新实现使用的事实,字符,代表数字,位于随后to_i功能。 raise子句考虑无效输入, G。 8当基地是7

1

只是踢,这里就是你可以写你的方法的另一种方式:

C_TO_I = (?0..?9).each_with_index.to_h 

def s_to_i(str, base=7, mag=0) 
    return 0 if str.empty? 
    C_TO_I[str[-1]] * base ** mag + 
    s_to_i(str[0...-1], base, mag + 1) 
end 

str = "654" 
p s_to_i(str) # => 333 

当然,C_TO_I哈希以上将只基10和较低的工作。你可以用这样的方式一直到基地36:

C_TO_I = [ *?0..?9, *?a..?z ].each_with_index.to_h 
+1

'[?0??9,?a??z] .flat_map(&:to_a)'⇒'[*?0??9,*?a ..?z]'。 – mudasobwa

相关问题