Leetcode.com, задача №7. "Переворот числа"
!!НАШ БЛОГ ПЕРЕЕХАЛ!!
Мы создали свой сайт! Все материалы, опубликованные в этом блоге, переехали туда.
Наш новый сайт maddevelop.ru
А данную статью вы можете найти по ссылке
Условие
Дано 32-разрядное число со знаком. Необходимо поменять в нём порядок цифр, знак следует оставить. Если полученное число превышает границы 32-разрядного числа со знаком, то вернуть 0.
Пример №1
Входное число: 123
Выходное число: 321
Пример №2
Входное число: -123
Выходное число: -321
Пример №3
Входное число: 120
Выходное число: 21
Мой вариант решения
Для нахождения правильного ответа решил воспользоваться преобразованием числа в строку с последующим переворотом. Необходимо было лишь проследить за тем, чтобы остался знак "-" перед самим числом.
public class Solution {
public int Reverse(int x) {
Int64 reverse = x < 0 ?
Int64.Parse("-" + new string(x.ToString().ToCharArray().Skip(1).Reverse().ToArray())) :
Int64.Parse(new string(x.ToString().ToCharArray().Reverse().ToArray()));
if (reverse >= int.MinValue && reverse <= int.MaxValue)
return (int)reverse;
return 0;
}
}
Данный кусок кода прошёл тесты на сайте за 54 мс и занял второе место по популярности и быстродействию.
Наилучший по скорости вариант решения
Арифметические операции выполняются быстрее преобразований со строками. В этом варианте путем нахождения остатка от деления на десять получаются младшие разряды, которые последовательно перемещаются в старшие. Вычисления выполняются за 48 мс.
public class Solution {
public int Reverse(int x) {
var result = 0;
while (x != 0) {
try
{
checked
{
result = result * 10 + x % 10;
x = x / 10;
}
}
catch(Exception ex)
{
return 0;
}
}
return result;
}
}
Проиллюстрируем работу программы на примере числа -364.
- result = 0 * 10 + (-364) % 10 = 0 - 4 = -4; x = (-364) / 10 = -36;
- result = (-4) * 10 + (-36) % 10 = -40 - 6 = -46; x = (-36) / 10 = -3;
- result = (-46) * 10 + (-3) % 10 = -460 - 3 = -463; x = (-3) / 10 = 0.
Для контроля за переполнением результата арифметические действия выполняются в блочной форме ключевого слова checked. Если будет выявлено переполнение, то выбросится исключение. Тогда в блоке после ключевого слова catch немедленно вернётся 0.
Ещё больше интересной информации на нашем Telegram канале.