3.整数反转-LeetCode-Java

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1: 输入: 123 输出: 321
示例 2: 输入: -123 输出: -321
示例 3: 输入: 120 输出: 21
注意: 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [2^31,  2^311]。
请根据这个假设,如果反转后整数溢出那么就返回 0
// 解法一:暴力,直接StringBuffer.reverse倒转
class Solution {
    public static int reverse(int x) {
        try {
            // int -> String -> StringBuffer -> 再调用StringBuffer.reverse()方法
            String symbol = "";
            if (x < 0) symbol = "-";
            StringBuffer sb = new StringBuffer(String.valueOf(Math.abs(x)));
            StringBuffer revStr = sb.reverse();
            long revInt = Long.valueOf(symbol + revStr.toString());
            Double min = -Math.pow(2, 31);
            Double max = Math.pow(2, 31) - 1;
            if (min <= revInt && revInt <= max) {
                return (int) revInt;
            }
            return 0;
        } catch(Exception e) {
            return 0;
        }
    }
}
不添加try catch报错如下 这个测试用例过不了:
9646324351 NumberFormatException报错。String->long出错?
long的范围在-2^63 ~ 2^63-1,不确定报错是哪里报出来的?
java.lang.NumberFormatException: For input string: "9646324351"
  at line 68, java.base/java.lang.NumberFormatException.forInputString
  at line 658, java.base/java.lang.Integer.parseInt
  at line 776, java.base/java.lang.Integer.parseInt
	at __Deserializer__.toInteger(Unknown Source)
  at line 82, __Driver__.main
// 解法二:用 % / 将x的个、十、百、千、万...获取到后重新拼成新的返回值ret
class Solution {
     /**
     * 输入范围[−2^31,  2^31 − 1]
     * 先将x取正(排查−2^31,将−2^31取正已经超过int范围), 然后通过 % /获取余数与整数部分。
     */
    public static int reverse(int x) {
        if (x == Integer.MIN_VALUE) return 0; 
        int sign = x > 0 ? 1 : -1;
        x *= sign; // 将x取正
        long ret = 0; // 设置返回值 设置为long 因为翻转后可能会超过int范围
        while (x > 0) {
            ret = ret * 10 + x % 10;
            x = x / 10;
        }
        if (Integer.MIN_VALUE > ret || ret > Integer.MAX_VALUE) return 0;
        return (int) ret * sign;
    }
}

知识点总结:

java的8种基本数据类型:8 = 6+2
4 种整数类型(byteshortintlong)byte:1Byte(-2^7 ~ 2^7-1) -128~127 包装类:java.lang.Byte
short:2Byte(-2^15 ~ 2^15-1) -32768~32767 包装类:java.lang.Short
int:4Byte(-2^31 ~ 2^31-1)-2147483648~2147483647 包装类:java.lang.Integer
long:8Byte(-2^63 ~ 2^63-1)-9223372036854775808~9223372036854775807 包装类:java.lang.Long
2 种浮点数类型(floatdouble)float:4Byte (1.4E-45 ~ 3.4028235E38)(1 位符号位,8 位指数,23 位有效尾数)包装类:java.lang.Float
double:8Byte(4.9E-324 ~ 1.7976931348623157E308)(1 位符号位,11 位指数,52 位有效尾)包装类:java.lang.Double
1 种字符类型(char)char:2Byte(java使用UTF-16:2位存储代码点) 包装类:java.lang.Character
1 种布尔类型(boolean)true,falseboolean:1bit 包装类:java.lang.Boolean
byte:
0127 二进制为 0000000001111111
-128-1 二进制为 1000000011111111
byte bt = (byte) (127+1);
System.out.println(bt);// -128

计算float最大取值: [参考](https://blog.csdn.net/weixin_34321977/article/details/91732230)
8 位指数=> -128~127
C语言16进制表示float的最大值,指数取1270x1.fffffep127f3.4*10^38
11111111 11111111 11111110 = fffffe
最高位总为1(省略的),所以0x1.fffffe*2^1272*2^1272^128
同理double计算最大值:
0x1.fffffffffffff*2^10232*2^10232^10241.7976931348623157E308

char:
[参考](https://blog.csdn.net/yaomingyang/article/details/79374209)
Java的char内部编码为UTF-16,Java的char只能表示utf­16中的bmp部分字符
Unicode标准把代码点分成了17个代码平面(Code Plane),编号为#0到#16。
每个代码平面包含65,5362^16)个代码点
Plane#0 BMP(Basic Multilingual Plane)大部分常用的字符都坐落在这个平面内,比如ASCII字符,汉字等

ASCII: 1B=8byte可表示2^8=256个字符:
美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今,ASCII码一共规定了128个字符的编码,大写的字母A是65。
Unicode:只是一个编码规范(常用有UTF-8:变长1~4字节,UTF-16:2字节,UTF-324字节),Unicode包含了ASCII,具体的符号对应表可以查询unicode.org 
任何文字在Unicode中都对应一个值,这个值称为代码点:UCS-2(Universal Character Set coded in 2 octets)
规定代码点在计算机中如何存储:UTF(Unicode Transformation Format)
Unicode目前普遍采用的是UCS-2,S-2最多能编码65536个字符(能表示简体7000),简体和繁体总共有六七万个汉字,为了能表示所有汉字,Unicode也有UCS-4规范,就是用 4个字节来编码字符.
常用为UTF-8:变长编码(对于单字节的符号字节的第一位设为0,对于n字节的符号(n > 1),第一个字节的前n位都设为1)

char c1 = 'A'; // char只能存单个字符 char c1='AA'是错误的
char c2 = 65; // char赋值 10进制 8进制 16进制都可直接转换为Unicode对应的字符
char c3 = 0101;
char c4 = 0x41;
char c5 = 10000;
// 中文字符一般占3~4位(这里是针对UTF-8存储方式),char占2位(对应Unicode),char字符存储的是Unicode编码的代码点,
// 虽然UTF-8编码的中文字符是占用3个或者4个字节,但是对应的代码点仍然集中在[0x4E00, 0x9FBB],所以char是能够存下在这个范围内的中文字符的
char c6 = '谭';
char c7 = '譚';
char c8 = '\u4E25';// 输出Unicode代码点对应的字符
char c9 = 'A' + '6' - '3'; //字符'A' Unicode对应为65,字符'6'对应为54,字符'3'对应为51,65+54-51=58对应D
// char c10 = '\u1f475';// char只能表示下16位的代码点 对应UCS-2的Unicode


String StringBuffer StringBuild 区别:
[参考](https://blog.csdn.net/weixin_41101173/article/details/79677982)
String:不可变字符串,每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间
StringBuilder:可变字符序列、线程不安全、效率高
StringBuffer:可变字符串、线程安全、效率低
(1)如果要操作少量的数据用 String
(2)单线程操作字符串缓冲区下操作大量数据 StringBuilder
(3)多线程操作字符串缓冲区下操作大量数据 StringBuffer

Math函数常用方法:随机数返回[0,1)、取整、返回较大值和较小值、三角函数、对数、指数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值