my-solutions/problems/8-string-to-integer/main.rb
2022-12-03 12:19:24 +05:00

56 lines
1.2 KiB
Ruby

def my_atoi(s)
res = 0
sign = 1
sign_was_scanned = false
digit_was_scanned = false
i32_min = -2_147_483_648
i32_max = 2_147_483_647
s.each_char do |c|
if c >= '0' && c <= '9'
digit_was_scanned = true
conv = c.ord - '0'.ord
# Add new digit
res = res * 10 + conv * sign
# Test overflow
return i32_max if sign > 0 && res > i32_max
return i32_min if sign < 0 && res < i32_min
# First '-'
elsif c == '-' && sign_was_scanned == false && digit_was_scanned == false
sign_was_scanned = true
sign *= -1
# First '+'
elsif c == '+' && sign_was_scanned == false && digit_was_scanned == false
sign_was_scanned = true
# Repeated '-' or '-' after number
elsif c == '-'
return res
# Repeated '+' or '+' after number
elsif c == '+'
return res
# Letters before number
elsif c != '+' && c != ' ' && digit_was_scanned == false
return 0
# Space after sign
elsif c == ' ' && sign_was_scanned
return res
# Letters after number
elsif digit_was_scanned == true
return res
end
end
res
end