leetcode刷刷题(42) ---- 整数反转(C语言版)

2020-6-2

  • Don’t spend another minute being angry about yesterday.
    不要再浪费时间为昨天而懊恼。

题目

  • leetcode 7. 整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321
 示例 2:

输入: -123
输出: -321
示例 3:

输入: 120
输出: 21
注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

个人解答:(C版本)

  • 方法一:使用一个数组分别存储这个整数按位拆分的数。(有点占空间,不推荐该方法)
int reverse(int x){
    int buf[32] = {0};
    int flag = 1;
    long int var = 0;

    if(x < 0)
    {
        flag = -1;
        if(x == -((long)1<<31))
            return 0;
        x = -x;
    }

    int k = 0;
    for(int i=0; i<32 && x>0; ++i)
    {
        buf[i] = x%10;
        x /= 10;
        ++k;
    }

    for (int j=0; j<k; ++j)
    {
        var = var*10 + buf[j];
    }

    if(-1 == flag)
    {
        var = -var;
    }

    if((var < (-((long)1<<31))) || var>(((long)1<<31)-1))
        return 0;

    return (int)var;
}
  • 复杂度分析
    1)该算法的时间复杂度为O(n)。
    2)由于只使用了常量空间,空间复杂度为O(1)。
  • 运行结果:
    在这里插入图片描述
  • 方法二:对方法一进行优化,直接用一个64bit的长整形来保存转换后的值,其他的无非是做些判断,代码就清晰多了。
int reverse(int x){
    int flag = 1; // 用来记录是否是负数
    long int var = 0;

	// 标记正负,并求取其绝对值,对绝对值反转更容易些
    if(x < 0)
    {
        flag = -1;
        if(x == -((long)1<<31)) // 如果是-2^31,求其绝对值就会溢出
            return 0;
        x = -x;  // 得到其绝对值
    }

	// 用一个长整型来存储反转的值,确保数据不会丢失
    while(x>0) 
    {
        var = var*10 + x%10;
        x /= 10;
    }

	// 若之前的数,为负,则将反转的数也取为负数
    if(-1 == flag)
    {
        var = -var;
    }

	// 判断反转的数是否在32bit的范围内
    if((var < (-((long)1<<31))) || var>(((long)1<<31)-1))
        return 0;

    return (int)var; // 返回强制转换后的数
}
  • 复杂度分析
    1)该算法的时间复杂度为O(n)。
    2)由于只使用了常量空间,空间复杂度为O(1)。
  • 运行结果
    在这里插入图片描述
他山之石:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章