每周一道算法题(四)

这周的题目很简单,因为简单,就写了两种方法,一种是“直接法”,效率较低,一种是“曲线法”,效率高一些,下面来看题目吧。。。

题目:反转一个32位的int整数,然后把整数的每一位倒过来。比如:x=123,返回321

题目比较简单,但有两点需要注意,第一点是整数的符号(正负),另一点就是溢出问题,如果溢出,则返回0.下面来看看我的代码(假设给出的整数位x)

    //整数介于-10到10之间不需要反转
    if (-10 < x && x < 10) 
    return x;
    //处理整数的符号(正负)
    int sign = 0;
    if (x < 0) {
        sign = 1;
        x = -x;
    }
    /*曲线法:效率较高,将数字转化为字符串,将反向遍历的新字符串转化成整数
    int count = 1,num = x;
    while(num >=10) {
        num /= 10;
        count++;
    }
    
    char tempStr[count],resultStr[count];
    sprintf(tempStr,"%d",x);
    for (int i = 0; i < count ; i++) {
        int temp = count - i - 1;
        resultStr[i] = tempStr[temp];
    }
    
    long result = atol(resultStr);*/

    //直接法:效率较低,直接将整数进行反转
    long result = 0;
    while (x != 0) {
        result = result * 10 + x % 10;
        x /= 10;
    }
    //还原整数的符号
    if (sign) {
        result = -result;
    }
    //判断是否溢出
    if (INT32_MAX < result || result < INT32_MIN) {
        return 0;
    }else {
        return result;
    }

在做这道算法题的时候发现了个奇怪的问题,就是当我使用曲线法中的sprintf()函数以后,我的printf函数就失效了,在控制台就不输出任何内容,后来发现是添加一个\n换行符即可,否则系统以为后面还有。。。

版权声明:本文为 Crazy Steven 原创出品,欢迎转载,转载时请注明出处!

你可能感兴趣的:(每周一道算法题(四))