January 15, 2019

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.

  1. result = 0 * 10 + (-364) % 10 = 0 - 4 = -4; x = (-364) / 10 = -36;
  2. result = (-4) * 10 + (-36) % 10 = -40 - 6 = -46; x = (-36) / 10 = -3;
  3. result = (-46) * 10 + (-3) % 10 = -460 - 3 = -463; x = (-3) / 10 = 0.

Для контроля за переполнением результата арифметические действия выполняются в блочной форме ключевого слова checked. Если будет выявлено переполнение, то выбросится исключение. Тогда в блоке после ключевого слова catch немедленно вернётся 0.



Ещё больше интересной информации на нашем Telegram канале.