最近打算练习写代码的能力,所以从简单题开始做。

大部分还是用C语言来解决。

@

题目

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123

输出: 321

示例 2:

输入: -123

输出: -321

示例 3:

输入: 120

输出: 21

注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

具体链接 https://leetcode-cn.com/problems/reverse-integer/

思路

其实这算很基础的问题了,首先就是想到利用循环结构,整数除法和取余来解决。但也会遇到边界值的问题,就要小心了。

初步想法

初步的想法就是用一个while循环,在循环里面解决取余和倒序相加的工作。

具体代码如下:

int reverse(int x) {
int num = 0;
while (x)
{
num = num * 10 + x % 10;
if (num > INT_MAX || num < INT_MIN)//边界值判断
return 0;
x = x / 10;
}
return num;
}

但是这种结构很容易遇到一个问题,就是当num达到边界时,再进行*10的运算就会溢出了,但判断在运算之后。

但是我又想到在C语言中还有long int类型,所以只要定义num为long int即可。

最后也通过了,代码如下:

int reverse(int x) {
long int num = 0;
while (x)
{
num = num * 10 + x % 10;
if (num > INT_MAX || num < INT_MIN)
return 0;
x = x / 10;
}
return num;
}

总结:这种改善也只是一种取巧的方法,当数据更大时就没办法了,而且会浪费很多空间。

进一步想法

于是我看了官方题解,发现官方是通过判断num与边界值的距离来避免溢出的。

我首先将if判断进行了替换,但发现还是不能通过,因为最小的边界还是会溢出,然后我发现官方题解中是先判断再进行倒序操作的,这样就可以有效解决问题了。

int reverse(int x) {
int num = 0;
while (x)
{ if (num > INT_MAX/10 || (num == INT_MAX / 10 && (x%10) > 7)) return 0;
if (num < INT_MIN/10 || (num == INT_MIN / 10 && (x%10) < -8)) return 0;
num = num * 10 + x % 10;
x = x / 10;
}
return num;
}

我觉得这个方法要求的判断条件太细致了,然后去网上看了看其他人的解法。有博主提到利用反推法判断是否溢出,但其实这种方法也是先计算再判断的。

具体链接 https://blog.csdn.net/bingkuoluo/article/details/83046469

我尝试提交后发现仍然会面临最大值溢出的问题,也不够安全,暂时没有找到更好的办法。

总结

注意语句的顺序问题,尤其是判断语句和判断条件的运算的问题。

要考虑数据的溢出问题。

在本题中,还是要先判断,再运算。

【LeetCode】 #7:反转整数 C语言的更多相关文章

  1. LeetCode 4.反转整数

    给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321  示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: ...

  2. LeetCode 7. 反转整数(Reverse Integer)

    题目描述 给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321  示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 ...

  3. Leetcode 7.反转整数 By Python

    给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假 ...

  4. leetcode记录-反转整数

    给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假 ...

  5. Leetcode 7 反转整数Reverse Integer

    给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321  示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: ...

  6. 【LeetCode题解】7_反转整数

    目录 [LeetCode题解]7_反转整数 描述 方法一 思路 Java 实现 类似的 Java 实现 Python 实现 方法二:转化为求字符串的倒序 Java 实现 Python 实现 [Leet ...

  7. leetcode每日一题——反转整数

    题目: 反转整数 难度: 简单 描述: 给定一个 32 位有符号整数,将整数中的数字进行反转. 解法: class Solution { public int reverse(int x) { //i ...

  8. LeetCode刷题--整数反转(简单)

    题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 12 ...

  9. C#版(击败97.76%的提交) - Leetcode 557. 反转字符串中的单词 III - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. Leetcod ...

随机推荐

  1. genie 来自netflix 的分布式大数据调度服务

    Genie是Netflix开发的联合作业编排引擎.Genie提供REST-ful API来运行各种大数据工作,如Hadoop,Pig,Hive,Spark,Presto,Sqoop等.它还提供用于管理 ...

  2. C# 全角半角字符互转

    /// <summary> /// 全角空格为12288,半角空格为32 /// 其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248 /// < ...

  3. SQL进阶-去重

    一.去重的2种基本方法 1.DISTINCT ## 建表: CREATE TABLE teacher( teacher_id ), teacher_name ), id_no ) ); CREATE ...

  4. Redis中删除过期Key的三种策略

    转载自:http://blog.csdn.net/a_bang/article/details/52986935?locationNum=9&fps=1 项目中有个接口要频繁调用查询数据库中的 ...

  5. 解决vue视图不渲染

    动态添加对象属性 //声明var travelMainVueObj;travelMainVueObj = new Vue({ "el" : "#portletConten ...

  6. Python3+mitmproxy安装使用教程(Windows)(转载)

    mitmproxy 是用于MITM的proxy,MITM中间人攻击.说白了就是服务器和客户机中间通讯多增加了一层.跟Fiddler和Charles最大的不同就是,mitmproxy可以进行二次开发,尤 ...

  7. HTML5中使用EventSource实现服务器发送事件

    在HTML5的服务器发送事件中,使用EventSource对象可以接收服务器发送事件的通知. 示例: es.html <!DOCTYPE html> <html> <he ...

  8. linux查看占用内存前10的命令

  9. java多线程(五)线程通讯

    1.1. 为什么要线程通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信. 1.2. 线程通讯方式 线程间通信常用方式如下 ...

  10. label vc

    #pragma once #include <QWidget> #include <QPaintEvent> #include <QPainter> #includ ...