《力扣题库(C):第7题 (整数反转)》

第七题:整数反转

  • 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果
  • 如果反转后整数超过 32 位的有符号整数的范围 [−2^31,  2^31 − 1] ,就返回 0
  • 假设环境不允许存储 64 位整数(有符号或无符号)
     

示例 1:

  • 输入:x = 123
  • 输出:321

示例 2:

  • 输入:x = -123
  • 输出:-321

示例 3:

  • 输入:x = 120
  • 输出:21

示例 4:

  • 输入:x = 0
  • 输出:0

提示:

  • -2^31 <= x <= 2^31 - 1

解题:

/**
 * @file 7.cpp
 * @author HarkerYX
 * @brief  整数反转
 * @version 0.1
 * @date 2021-04-28
 * 
 * @copyright Copyright (c) 2021
 * 
 */

/*
第七题:整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果
如果反转后整数超过 32 位的有符号整数的范围 [−2^31,  2^31 − 1] ,就返回 0
假设环境不允许存储 64 位整数(有符号或无符号)

解题思路:
32位有符号整数范围: -2147483648 < n < 2147483647

转为字符串比较
*/

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

/**
 * @brief 
 * 
 * @param x 
 * @return int 
 */
int reverse(int x){

    if(x == 0 || x >= 2147483647 || x <= -2147483648)
        return 0;

    //标记是否为负数
    int flag = (x<0)? 1:0;

    //从长度上看,最大最小长度是10,反转后长度是不变
    char str[10] = {'0'};

    if(flag)
        x = -x;

    itoa(x, str, 10);

    int len = strlen(str);
    // printf("1. %s , len = %d \n",str,len);

    //中心点对称交换左右两边
    for (int i = 0; i < len / 2; i++){

        char tmp = str[i];
        str[i] = str[len-i-1];
        str[len - i - 1] = tmp;
    }

    // printf("2. %s , len = %d \n",str,len);

    // 如果长度是小于10 直接再转为数字,如果长度是10要判断是否大于边界值
    // 字符串可以比较

    if(len == 10){
        if(flag){ // 负数
            // 大于,是因为加了负号就是小于 -2147483648 超过边界了
            if(strcmp(str,"2147483648")>0)
                return 0;
        }
        else{
            // 正数大于2147483647也超过边界了
             if(strcmp(str,"2147483647")>0)
                return 0;           
        }
    }

    //判断完后转为数字

    int ret = atoi(str);

    //不要忘记加符号
    ret = (flag == 1) ? -ret : ret;

    return ret;
}


int main(void)
{
    // int num = -2147483648;
    // int num = 2147483647;
    // int num = 0;
    // int num = 123;
    // int num = -123;
    int num = -335678990;

    int ret = 0;
    ret = reverse(num);

    printf("ret = %d\n",ret);
    return 0;
}
ret = -99876533

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HarkerYX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值