题目

给定一个32位有符号整数,将其进行反转。

引言

整数反转是一个简单但有趣的问题。给定一个整数,我们需要将其各个位上的数字反转,并保持符号不变。例如,对于整数 123,反转后的结果为 321。解决这个问题需要使用一种巧妙的方法。

算法思路

我们将使用一种巧妙的方法来解决整数反转问题。算法的思想是通过不断取整和取余来反转整数。

算法的步骤如下:

  1. 定义一个变量 result,用于保存反转后的结果。
  2. 循环执行以下步骤,直到给定整数为0:

    • 取给定整数的个位数字(通过对10取余)。
    • 将个位数字添加到 result 中。
    • 给定整数除以10,向下取整。
  3. 检查 result 是否溢出。如果溢出,则返回0。
  4. 返回 result

代码实现

下面是使用C语言实现的代码:

#include <stdio.h>
#include <limits.h>

int reverse(int x) {
    int result = 0;

    while (x != 0) {
        int digit = x % 10;
        x /= 10;

        // 检查溢出
        if (result > INT_MAX / 10 || (result == INT_MAX / 10 && digit > 7))
            return 0;
        if (result < INT_MIN / 10 || (result == INT_MIN / 10 && digit < -8))
            return 0;

        result = result * 10 + digit;
    }

    return result;
}

int main() {
    int num = 123;
    int reversed = reverse(num);

    printf("Input: %d\n", num);
    printf("Reversed: %d\n", reversed);

    return 0;
}

算法分析

该算法的时间复杂度为 O(log(x)),其中 x 是给定整数的位数。在循环中,我们每次都将给定整数除以10,因此循环的次数取决于给定整数的位数。

空间复杂度为 O(1)。

示例和测试

示例输入1:

Input: 123

示例输出1:

Reversed: 321

示例输入2:

Input: -123

示例输出2:

Reversed: -321

示例输入3:

Input: 120

示例输出3:

Reversed: 21

示例输入4:

Input: 1534236469

示例输出4:

Reversed: 0

总结

本文使用C语言实现了解答整数反转算法问题的代码。通过不断取整和取余操作,我们能够将给定整数进行反转。需要注意溢出的情况,并及时进行检查。该算法的时间复杂度为 O(log(x)),空间复杂度为 O(1)。

标签: 编程算法, 编程算法题, 编程算法大全, 编程算法流程, 算法设计与分析, 数据结构与算法, 算法优化, 算法实现, 常见编程算法, 编程算法入门, 编程算法进阶, 编程算法精通