LeetCode刷题day007 (Jieky)

LeetCode第7题

/*
Given a 32-bit signed integer, reverse digits of an integer.

Example 1:
Input: 123
Output: 321

Example 2:
Input: -123
Output: -321

Example 3:
Input: 120
Output: 21

Note: Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^31, 2^31 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
*/
public class ReverseInteger{
     
	
	// https://blog.csdn.net/qq_32534441/article/details/91596347
	// https://wenku.baidu.com/view/ddb7729911661ed9ad51f01dc281e53a59025119.html
	// https://zhidao.baidu.com/question/35595025
	public static void main(String[] args){
     
		// 在java虚拟机中整数有byte、short、int、long四种 分别表示 8位、16位、32位、64位有符号整数。整数使用补码表示。
		// 正数:它的原码、反码、补码相同。
		// 负数:反码符号位不变化,其余位数取反,补码符号位不变化其余各位原码取反(反码)+1换言之 反码+1
		// 负数的补码符号位为1,这位1即是符号位也是数值位
		// 已知一个负数的补码,将其转换为十进制数:1、先对各位取反;2、将其转换为十进制数;3、加上负号,再减去1。
		
		/*
		举例:
		[+0]原码=0000 0000,   [-0]原码=1000 0000
		[+0]反码=0000 0000,   [-0]反码=1111 1111
		[+0]补码=0000 0000,   [-0]补码=0000 0000  
		补码没有正0与负0之分,负数的反码是其原码除符号位外其他位取反,负数的补码是其取反码后加1。
		*/
		
		// 最大正整数int:2147483647
		int intMAX  = 0b01111111111111111111111111111111;
		System.out.println("最大整数:" + intMAX );
		
		// 最大负整数int:-2147483648
		// 负数的补码是它原数的反码加1,最小值,就是负得最多的数,
		// 原码
		int num2_0 = 0b11111111111111111111111111111111 + 0b10000000000000000000000000000001;
		// 反码
		int num2_1 = 0b10000000000000000000000000000000 + 0b11111111111111111111111111111110;
		// 补码
		int intMin  = 0b10000000000000000000000000000001 + 0b11111111111111111111111111111111;
		System.out.println("最小整数:" + intMin );
		if(intMin == 0b10000000000000000000000000000000)System.out.println("求得最小整数的补码!!!");
		
		// 输出int的最大整数二进制补码
		System.out.println("0"+Integer.toBinaryString(2147483647));
		// 输出int的最小整数二进制补码
		System.out.println(Integer.toBinaryString(-2147483648));
		System.out.println("------------------------------------------------------");
		// System.out.println(-5/3);
		// System.out.println(-5%3);
		int input_num1 = 23;
		int input_num2 = -23;
		int input_num3 = intMAX;
		
		ReverseInteger ri = new ReverseInteger();
		int ret = ri.reverse02(input_num1);
		System.out.println(ret);
	}
	
	// 解决溢出的问题
	public int reverse02(int x){
     
		int ret = 0;
		while(x != 0){
     
			// ret = 214748364时,x%10 <= 2(最大int整数的首位),后面计算ret时一定不会向上溢出
			// ret > 214748364时,例如:ret = 214748365时,后面计算ret时一定会向上溢出
			if(ret > Integer.MAX_VALUE/10) return 0;
			
			// ret = -214748364,x%10 <= 2(最小int整数的首位),后面计算ret时一定不会向下溢出
			// ret < -214748364时,例如:ret = -214748365时,后面计算ret时一定会向下溢出
			if(ret < Integer.MIN_VALUE/10) return 0;
			
			// 10的余数依次往后接
			ret = ret * 10 + x%10;
			x = x/10;
		}
		return ret;
	}
	
	// 会存在溢出的问题
	public int reverse01(int x){
     
		int ret = 0;
		while(x != 0){
     
			// 10的余数依次往后接
			ret = ret * 10 + x%10;
			x = x/10;
		}
		return ret;
	}
}

你可能感兴趣的:(LeetCode,java,LeetCode)