План курса / Все задачи / Алгоритмы и структуры данных
Разворот числа
средне
# решено
Дано целое число n. Нужно вернуть n в обратном порядке, не преобразовывая его в строку. Если при этом происходит переполнение, функция должна вернуть 0.
Считаем, что переполнение происходит, если результат разворота числа превышает максимально допустимое значение для типа int32. В таких случаях возвращаем 0.
Пример 1:
Ввод: n = 123
Вывод: 321
Пример 2:
Ввод: n = 1534236469
Вывод: 0
Ограничения:
0 <= n <= int32_max
public class Solution {
public static int ReverseNum(int n) {
int result = 0;
if (n < 0) {
return -ReverseNum(-n);
}
int maxInt = int.MaxValue;
while (n > 0) {
// проверка на переполнение
if (result > maxInt / 10) {
return 0;
}
result = result * 10 + n % 10;
n /= 10;
}
return result;
}
}
using namespace std;
int reverseNum(int n) {
int result = 0;
if (n < 0) {
return -reverseNum(-n);
}
int maxInt = (1 << 31) - 1;
while (n > 0) {
// проверка на переполнение
if (result > maxInt / 10) {
return 0;
}
result = result * 10 + n % 10;
n /= 10;
}
return result;
}
package main
func reverseNum(n int) int {
result := 0
if n < 0 {
return -reverseNum(-n)
}
maxInt := 1<<31 - 1
for n > 0 {
// проверка на переполнение
if result > maxInt/10 {
return 0
}
result = result*10 + n%10
n /= 10
}
return result
}
import java.util.*;
public class Solution {
public Integer reverseNum(Integer n) {
if (n == null) {
return null;
}
int result = 0;
if (n < 0) {
return -reverseNum(-n);
}
int maxInt = Integer.MAX_VALUE;
while (n > 0) {
// проверка на переполнение
if (result > maxInt / 10) {
return 0;
}
result = result * 10 + n % 10;
n /= 10;
}
return result;
}
}
from typing import *
def reverse_num(n: int) -> int:
result = 0
if n < 0:
return -reverse(-n)
max_int = 2 ** 31 - 1
while n > 0:
# проверка на переполнение
if result > max_int // 10:
return 0
result = result * 10 + n % 10
n //= 10
return result
/**
* @param {number} n
* @returns {number}
*/
export function reverseNum(n) {
let result = 0;
if (n < 0) {
return -reverseNum(-n);
}
const maxInt = Math.pow(2, 31) - 1;
while (n > 0) {
// проверка на переполнение
if (result > Math.floor(maxInt / 10)) {
return 0;
}
result = result * 10 + n % 10;
n = Math.floor(n / 10);
}
return result;
}
Оценка сложности
Время: O(1)
Память: O(1)
Время и память O(1), потому что у нас есть ограничение: мы работаем с числами типа int32. Это значит, что максимум может быть 32 разряда - это константа, поэтому оцениваем как время, так и память O(1).