第七题:整数反转
- 给你一个 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