第七题:整数反转(Reverse Integer)

2024-08-25 11:04

本文主要是介绍第七题:整数反转(Reverse Integer),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述:

给定一个 32 位有符号整数 x,返回其反转后的整数。反转后的整数可能会超出 32 位整数的范围,因此需要注意处理溢出情况。

示例:

  1. 输入:x = 123
    输出:321

  2. 输入:x = -123
    输出:-321

  3. 输入:x = 120
    输出:21

  4. 输入:x = 0
    输出:0

要求: 需要考虑反转后的整数是否会超出 32 位整数的范围。32 位有符号整数的范围是 ([-2^{31}, 2^{31} - 1]),即 ([-2147483648, 2147483647])。

解题思路

  1. 处理符号

    • 记录整数的符号(正或负),然后将整数转为正数来进行处理。
  2. 反转整数

    • 通过逐位提取整数的末尾数字,并将其添加到新整数的末尾,从而反转整数。
  3. 检查溢出

    • 在每次更新反转结果时,检查是否会发生溢出。如果结果超出了32位整数的范围,则返回0。

C 语言实现

#include <limits.h>int reverse(int x) {int reversed = 0;while (x != 0) {int digit = x % 10;// Check for overflow/underflowif (reversed > (INT_MAX - digit) / 10 || reversed < (INT_MIN - digit) / 10) {return 0;}reversed = reversed * 10 + digit;x /= 10;}return reversed;
}

Java 实现

public class Solution {public int reverse(int x) {int reversed = 0;while (x != 0) {int digit = x % 10;// Check for overflow/underflowif (reversed > Integer.MAX_VALUE / 10 || (reversed == Integer.MAX_VALUE / 10 && digit > 7)) {return 0;}if (reversed < Integer.MIN_VALUE / 10 || (reversed == Integer.MIN_VALUE / 10 && digit < -8)) {return 0;}reversed = reversed * 10 + digit;x /= 10;}return reversed;}
}

Python 实现

def reverse(x: int) -> int:reversed_x = 0sign = -1 if x < 0 else 1x *= signwhile x != 0:digit = x % 10# Check for overflow/underflowif reversed_x > (2**31 - 1 - digit) // 10:return 0reversed_x = reversed_x * 10 + digitx //= 10return reversed_x * sign

时间复杂度

时间复杂度: (O(\log_{10} n)),其中 (n) 是输入整数的绝对值。因为我们处理的每一位数字需要一次操作,整数的位数与其值的对数成正比。

空间复杂度: (O(1))。我们只使用了常数级别的额外空间来存储反转后的结果和处理过程中的变量。

这篇关于第七题:整数反转(Reverse Integer)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105382

相关文章

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但

单精度浮点数按存储格式转为整数的程序

///#include<cstdio>//-----------------union int_char{unsigned char ch[4];float i;};void out_put(union int_char x)//x86是小端对其模式,即最数据的最低位存储在地址的最低位上。{printf("单精度浮点数值为:%f\n",x.i,x.i);printf("存储位置从左到右

leetcode#541. Reverse String II

题目 Given a string and an integer k, you need to reverse the first k characters for every 2k characters counting from the start of the string. If there are less than k characters left, reverse all of

用异或交换两个整数的陷阱

前面我们谈到了,可用通过异或运算交换两个数,而不需要任何的中间变量。 如下面: void exchange(int &a, int &b) {     a ^= b;     b ^= a;     a ^= b; } 然而,这里面却存在着一个非常隐蔽的陷阱。 通常我们在对数组进行操作的时候,会交换数组中的两个元素,如exchang(&a[i], &b[j]),

MapReduce算法 – 反转排序(Order Inversion)

译者注:在刚开始翻译的时候,我将Order Inversion按照字面意思翻译成“反序”或者“倒序”,但是翻译完整篇文章之后,我感觉到,将Order Inversion翻译成反序模式是不恰当的,根据本文的内容,很显然,Inversion并非是将顺序倒排的意思,而是如同Spring的IOC一样,表明的是一种控制权的反转。Spring将对象的实例化责任从业务代码反转给了框架,而在本文的模式中,在map

Java中等题-整数替换(力扣)

给定一个正整数 n ,你可以做如下操作: 如果 n 是偶数,则用 n / 2替换 n 。如果 n 是奇数,则可以用 n + 1或n - 1替换 n 。 返回 n 变为 1 所需的 最小替换次数 。 示例 1: 输入:n = 8输出:3解释:8 -> 4 -> 2 -> 1 示例 2: 输入:n = 7输出:4解释:7 -> 8 -> 4 -> 2 -> 1或 7 ->

43. 1 ~ n 整数中 1 出现的次数【难】

comments: true difficulty: 中等 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9843.%201%EF%BD%9En%E6%95%B4%E6%95%B0%E4%B8%AD1%E5%87%BA%E7%8E%B0%E7%9A%84%E6%AC%A1%

【LeetCode】07.整数反转

题目要求 解题思路 这道题的难点在于怎么判断越界,我们无法直接与最大值或最小值比较,但是由于每一次我们的ret都需要乘10这个特性来使用ret与最大值或最小值除10进行比较 代码实现 class Solution {public:int reverse(int x) {int ret=0;while(x){//处理越界情况if(ret<INT_MIN/10||ret>INT_MAX