给你一个 32 位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1]
,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123 输出:321
示例 2:
输入:x = -123 输出:-321
示例 3:
输入:x = 120 输出:21
思路
面对这种看似小白但是有抽象条件的题我们直接选择大搞函数库主义。
介绍以下五个函数:
sprintf(char *str,"",int x),和printf类似,不过是向char[]写入文本。
reverse(a或begin(),a+n或end())将容器a到a+n(或begin到end的左闭右开区间的内容翻转)
strcmp(char *str1,char *str2)按字典序逐个比较str1和str2,到某个字符时str1大于str2则返回正数,完全一致则返回零,否则返回负数(与长度无关,只取决于对应位置的字符大小关系,如"ab"大于"aaa")
strlen(char *str)返回不包括最后一位'\0'在内的字符串长度
stoi(char *str)将由str[0]开始的完全由数字和正负号组成的子串转换为其书面意义上的数字。
介绍一个C++预定义宏:
INT_MAX,定义在limit.h文件下的预定义宏,表示32位有符号整数的最大正值。
解题过程
sprintf将数字x和INT_MAX录入字符串,z对应的字符串翻转后与INT_MAX字符串比较,长度过长或strcmp返回整数则输出0,否则stoi输出对应数字
实测击败全世界。
Code
class Solution {
public:
int reverse(int x) {
char str[15]={0};sprintf(str,"%d",x);
char MAX[15]={0};sprintf(MAX,"%d",INT_MAX);
int i,ans=0;
if(str[0]=='-')i=1;else i=0;
::reverse(str+i,str+strlen(str));
if(strlen(str+i)>strlen(MAX)||strlen(str+i)==strlen(MAX)&&strcmp(str+i,MAX)>0)
return 0;
else return stoi(str);
}
};