项目场景
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-2^31 <= x <= 2^31 - 1
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-integer
问题描述及解决
1. x的范围问题
int型整数范围:-2^31 <= x <= 2^31 - 1。
当x = -2^31时,-x = 2^31,超出了int型整数范围。
2. 注意区分while循环语句 和 if条件判断语句
写代码时我用了while循环,导致程序出现了死循环的情况,超出时间限制。
这里应该用if条件判断语句。
源代码
#include<math.h>
#define MaxSize 11
//定义循环队列
int* queue;
int front; //队头
int rear; //队尾
int maxSize; //当前能容纳最大元素个数
//初始化队列
void InitQueue()
{
queue = (int*)malloc(sizeof(int)*MaxSize);
front = 0;
rear = 0;
maxSize = MaxSize;
}
//入队
void Insert_queue(int key)
{
rear = (rear + 1) % maxSize;
queue[rear] = key;
}
int reverse(int x){
int flag = 0;
//是负数的话,先转化为正数,并标记
if (x < 0)
{
//变正负后可能会超出int型整数范围
if (-x < -pow(2, 31) || -x > pow(2, 31) - 1)
return 0;
else
x = -x;
flag++;
}
InitQueue();
//将一个数从从后往前入队
int i = 0; //记录数据的位数
while(x % 10 != 0 || x != 0)
{
Insert_queue(x%10);
x = x / 10;
i++;
}
long long ret = 0;
//将元素一个一个出队
while (front != rear)
{
i--;
front = (front + 1) % maxSize;
ret += queue[front] * pow(10,i);
}
//标记为负数的情况
if (flag == 1)
{
ret = -ret;
}
if (ret < -pow(2, 31) || ret > pow(2, 31) - 1)
return 0;
else
return ret;
}