LeetCode-探索-初级-字符串-整数反转-java

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

示例 1:

输入: 123
输出: 321

 示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

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


方法很多,第一种方法:

只要是涉及反转的,首先想到数组中的反转方法:

1 将int转化为String,进而转化为char[]

2 在char[]中完成反转

3 判断是否溢出

public int reverse(int x) {
        int signal = 1;
        if (x < 0)
            signal = -1;
        String target = signal * x + "";    //omit the signal
        char[] chars = target.toCharArray();
        char temp = 0;
        int symmetryI = 0;
        for (int i = 0 ; i < target.length() >> 1 ; i ++) {
            symmetryI = target.length() - 1 - i;
            temp = chars[i];
            chars[i] = chars[symmetryI];
            chars[symmetryI] = temp;
        }
        int result = 0;
        try {
            result = signal * Integer.parseInt(new String(chars));
        } catch (NumberFormatException e) {
            result = 0;
        }
        return result;
    }

第二种方法:

凡是涉及到反转的,很难让人不想到栈这个数据结构,是的,我们可以通过栈来进行反转:

public int reverse1(int x) {
        java.util.Stack stack = new java.util.Stack();
        int signal = 1;
        if (x < 0)
            signal = -1;
        String target = signal * x + "";
        char[] chars = target.toCharArray();
        for (int i = 0 ; i < chars.length ; i ++)
            stack.push(chars[i]);
        for (int i = 0 ; i < chars.length ; i ++)
            chars[i] = (char)stack.pop();
        int result = 0;
        try {
            result = Integer.parseInt(new String(chars));
        } catch (NumberFormatException e) {
            result = 0;
        }
        return signal * result;
    }

第三种方法:

因为是整数类型的,(或者说是数值类型的更加合适),我们可以利用数学的方法进行一个数字的倒置。

值得一提的是数字反转需要考虑到溢出问题:

public int reverse0(int x) {
        int result = 0;
        while (x != 0) {
            int digit = x % 10;  //get the last digit of x.
            if (result > Integer.MAX_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && digit > 7) ||
                    result < Integer.MIN_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && digit < -8))
                return 0;
            result = result * 10 + digit;
            x = x / 10;    //make the digit before the last become the last one.
        }
        return result;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值