力扣刷题-7.整数反转

题目详情

题解

int reverse(int x){
    //数字转字符串
    char s[20] = {'\0'};
    sprintf(s,"%d",x);
    //定位数字开头
    int begin = 0;
    if(s[0] == '-'){
        begin++;
    }
    //定位数字末尾
    int end = strlen(s)-1;
    while(s[end] == '0' && end > begin){
        s[end] = '\0';
        end--;
    }
    //反转交换
    while(end > begin){
        char temp = s[begin];
        s[begin] = s[end];
        s[end] = temp;
        begin++;
        end--;
    }
    //判断范围、返回
    int topThresh = 2147483647;
    int botThresh = -2147483648;
    char top[20] = {'\0'};
    sprintf(top,"%d",topThresh);
    char bottom[20] = {'\0'};
    sprintf(bottom,"%d",botThresh);
    //超限情况
    if(s[0] != '-'){
        if(strlen(s) > strlen(top)){
            return 0;
        }
        if(strlen(s) == strlen(top)){
            int result = strcmp(s,top);
            if(result > 0){
                return 0;
            }
        }
    }else{
        if(strlen(s) > strlen(bottom)){
            return 0;
        }
        if(strlen(s) == strlen(bottom)){
            int result = strcmp(s,bottom);
            if(result > 0){
                return 0;
            }
        }
    }
    //正常情况
    x = atoi(s);
    return x;
}

要点

  1. int类型转字符串使用sprintf函数,字符串转int类型使用atoi函数。

  1. 本题难点不在于整数反转而在于判断反转后是否超出限制。思路是将上下两限也转换成字符串后使用字符串的比较strcmp函数做比较。

strcmp函数用作数字比较的说明:
1.函数说明:函数原型是int strcmp(char* s1,char* s2)。比较时是两个字符串逐个位置的比较,即在某位置比较相同时比较下一个,当遇到不相同的位置,s1该位置的ascll码>s2该位置的ascll码返回正数,否则返回负数,若所有都相同则返回0。至于返回的是1、0、-1还是ascll相减的差值看编译器,不过其实也不重要,用来做判断而已。
2.正数之间的比较:设比较s1与s2。先通过strlen函数比较s1与s2的长度,若s1的长度更长则更大长度更短则更小,没什么好说的。如果长度相等则利用strcmp函数的功能,当s1>s2时有strcmp(s1,s2)>0,当s1<s2时有strcmp(s1,s2)<0。
3.负数之间的比较:设比较s1与s2。在长度不相等方面,更长则表示负得更多为较小值。在长度相等方面,由于使用的是字符串来比较,因此s[0]都是等于'-',对strcmp的比较不影响,因此其实可以把这个符号省略,只比较后面的“正数”部分。但注意结果是相反的,正数大结果小。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

东东咚咚东

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

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

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

打赏作者

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

抵扣说明:

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

余额充值