abs 不会整数 方法 溢出_7. 整数反转

81554001a44f84faae4bb042ff068a9c.png

题目

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

示例 1

输入: 123 输出: 321

示例 2

输入: -123 输出: -321

示例 3

输入: 120 输出: 21

注意

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

CPP

class Solution {
public:
	int weishu[10] = { 1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000 };
	int max = 0x7fffffff;
	int reverse(int x) {
		vector<double> ret;
		double rev_num = 0;
		while (1) {
			ret.push_back(x % 10);
			x = x / 10;
			if (x == 0) {
				break;
			}
		}
		int j;
		for (int i = ret.size() - 1, j = 0; i >= 0; i--, j++) {
			rev_num += ret[i] * weishu[j];
		}
		return rev_num > max || rev_num < (-1 * (max + 1)) ? 0 : rev_num;
	}
};
class Solution {
public:
	int reverse(int x) {
		int max = 0x7fffffff;
		long b = 0;
		while (x != 0) {
			b = b * 10 + x % 10;
			x = x / 10;
		}
		return (b > max || b < (-1 * (max + 1))) ? 0 : b;
	}
};

官方解答

方法:弹出和推入数字 & 溢出前进行检查

思路

我们可以一次构建反转整数的一位数字。在这样做的时候,我们可以预先检查向原整数附加另一位数字是否会导致溢出。

算法

反转整数的方法可以与反转字符串进行类比。

我们想重复“弹出” x 的最后一位数字,并将它“推入”到 rev 的后面。最后,rev 将与 x 相反。

要在没有辅助堆栈 / 数组的帮助下 “弹出” 和 “推入” 数字,我们可以使用数学方法。

//pop operation:
pop = x % 10;
x /= 10;

//push operation:
temp = rev * 10 + pop;
rev = temp;

但是,这种方法很危险,因为当 temp=rev⋅10+pop 时会导致溢出。

幸运的是,事先检查这个语句是否会导致溢出很容易。

为了便于解释,我们假设 rev 是正数。

b039666c4e00d660bf0cc5b404b81c7e.png

当rev为负时可以应用类似的逻辑。

class Solution {
public:
    int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
            if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;
        }
        return rev;
    }
};

复杂度分析

  • 时间复杂度:O(log(x)),x 中大约有
    位数字。
  • 空间复杂度:O(1)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C++实现代码: ```c++ #include <iostream> #include <fstream> #include <cstdlib> using namespace std; void generateRandomNumbersToFile(int count) { ofstream fout_txt("random_number.txt"); ofstream fout_bin("random_number.dat", ios::binary); for (int i = 0; i < count; i++) { int num = rand() % 10001; fout_txt << num << endl; fout_bin.write((char*)&num, sizeof(num)); } fout_txt.close(); fout_bin.close(); } void readAllNumbersFromBinaryFile() { ifstream fin("random_number.dat", ios::binary); int num; while (fin.read((char*)&num, sizeof(num))) { cout << num << endl; } fin.close(); } void readNumbersFromBinaryFileAtPosition(int pos, int count) { ifstream fin("random_number.dat", ios::binary); fin.seekg((pos-1)*sizeof(int)); int num; for (int i = 0; i < count && fin.read((char*)&num, sizeof(num)); i++) { cout << num << endl; } fin.close(); } int main() { srand(time(NULL)); generateRandomNumbersToFile(10); cout << "All numbers:" << endl; readAllNumbersFromBinaryFile(); cout << "Numbers at position 3-5:" << endl; readNumbersFromBinaryFileAtPosition(3, 3); return 0; } ``` 在这个程序中,我们使用了C++的文件输入输出流,通过打开文件、读写文件等操作,实现了对文件的读写和操作。其中: - generateRandomNumbersToFile函数:该函数用于生成指定数量的随机整数,并将这些整数分别保存到文本文件和二进制文件中。 - readAllNumbersFromBinaryFile函数:该函数用于从二进制文件中读取所有整数,并输出到屏幕上。 - readNumbersFromBinaryFileAtPosition函数:该函数用于从二进制文件中读取指定位置的某个整数或某几个整数,并输出到屏幕上。 在主函数中,我们首先调用generateRandomNumbersToFile函数生成了10个随机整数,并将它们保存到了文本文件和二进制文件中。然后,我们分别调用了readAllNumbersFromBinaryFile函数和readNumbersFromBinaryFileAtPosition函数,并将它们的输出结果展示出来。 注意,在二进制文件中读取整数时,我们使用了ifstream的read函数,并将读取的结果强制转换为int类型。同时,在读取指定位置的整数时,我们使用了ifstream的seekg函数来

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值