力扣LeetCode算法题 第7题-整数反转

文章提供了两种在Java中反转32位有符号整数的方法:一种是将整数转换为字符串进行反转,另一种是通过长整型变量和取余运算实现。代码中包含了详细的步骤和逻辑解释,特别处理了负数和溢出的情况。
摘要由CSDN通过智能技术生成

题目要求:

/**
 * 7. 整数反转
 *
 * 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
 *
 * 如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。
 *
 * 假设环境不允许存储 64 位整数(有符号或无符号)。
 *示例 1:
 *
 * 输入:x = 123
 * 输出:321
 * 示例 2:
 *
 * 输入:x = -123
 * 输出:-321
 * 示例 3:
 *
 * 输入:x = 120
 * 输出:21
 * 示例 4:
 *
 * 输入:x = 0
 * 输出:0
 *
 */

写上解题思路,是先把整数转换成字符串,因为我们知道,字符串中是有一个反转功能的。可以直接进行反转。

public static int reverse(int x) {
        //首先思路是有一个字符串是可以进行反转的
        String binaryStr = String.valueOf(x);

        //System.out.println(binaryStr);
        //1.如果小于0,则flag变成-1
        int flag=1;
        String substring =binaryStr;
        if(x<0){
            //截取掉第一位
            substring= binaryStr.substring(1);
            flag=-1;
            //System.out.println(substring);
        }
        //字母反转
        StringBuilder sb = new StringBuilder(substring);
        sb.reverse();
        try {
            //解析
            String reversedBinaryStr = sb.toString();
            //System.out.println(reversedBinaryStr);
            //System.out.println(Integer.parseInt(reversedBinaryStr)*(flag));
            return Integer.parseInt(reversedBinaryStr)*(-1);
        }catch (Exception e){
            return 0;
        }

    }

代码里有详细的步骤。

那么我这里再提供第二种办法,这种就稍微难以理解一些。也已经添加了注释

    public static int reverse1(int x) { // 定义一个名为reverse的方法,参数为一个整数x
        long flag = 0; // 定义一个长整型变量flag,初始值为0
        while(x != 0) { // 当x不等于0时,执行循环体内的语句
            flag = flag*10 + x%10; // 将flag乘以10再加上x除以10的余数,得到反转后的数
            x = x/10; // 将x除以10,去掉最后一位
        }
        return (int)flag==flag? (int)flag:0; // 如果反转后的数在int类型的范围内,则返回该数,否则返回0
    }

比如:

1.当x等于123,flag=0,进入循环

2.第一次循环,取余%10后,flag=-3.,x=-12

3.第二次循环,取余%10后,flag=-32.,x=-1

3.第三次循环,取余%10后,flag=-321.,x=0

4.跳出循环,输出结果

附上全部的代码,可以自己进行测试:

package com.zhm.test;

/**
 * @params Leetcode_test007
 * @return Leetcode_test007
 * @Author bigeZhong
 * 7. 整数反转
 *
 * 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
 *
 * 如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。
 *
 * 假设环境不允许存储 64 位整数(有符号或无符号)。
 *示例 1:
 *
 * 输入:x = 123
 * 输出:321
 * 示例 2:
 *
 * 输入:x = -123
 * 输出:-321
 * 示例 3:
 *
 * 输入:x = 120
 * 输出:21
 * 示例 4:
 *
 * 输入:x = 0
 * 输出:0
 *
 */
public class Leetcode_test007 {
    public static int reverse(int x) {
        //首先思路是有一个字符串是可以进行反转的
        String binaryStr = String.valueOf(x);

        //System.out.println(binaryStr);
        //1.如果小于0,则flag变成-1
        int flag=1;
        String substring =binaryStr;
        if(x<0){
            //截取掉第一位
            substring= binaryStr.substring(1);
            flag=-1;
            //System.out.println(substring);
        }
        //字母反转
        StringBuilder sb = new StringBuilder(substring);
        sb.reverse();
        try {
            //解析
            String reversedBinaryStr = sb.toString();
            //System.out.println(reversedBinaryStr);
            //System.out.println(Integer.parseInt(reversedBinaryStr)*(flag));
            return Integer.parseInt(reversedBinaryStr)*(-1);
        }catch (Exception e){
            return 0;
        }

    }

    public static int reverse1(int x) { // 定义一个名为reverse的方法,参数为一个整数x
        long flag = 0; // 定义一个长整型变量flag,初始值为0
        while(x != 0) { // 当x不等于0时,执行循环体内的语句
            flag = flag*10 + x%10; // 将flag乘以10再加上x除以10的余数,得到反转后的数
            x = x/10; // 将x除以10,去掉最后一位
        }
        return (int)flag==flag? (int)flag:0; // 如果反转后的数在int类型的范围内,则返回该数,否则返回0
    }



    public static void main(String[] args) {
        int test1=123;
        int test2=-123;
        int test3=120;
        int test4=0;

//        reverse(test1);
//        System.out.println("==================");
//        reverse(test2);
//        System.out.println("==================");
//        reverse(test3);
//        System.out.println("==================");
//        reverse(test4);

        //reverse1(test1);
        //System.out.println("==================");
        reverse1(test2);
        //System.out.println("==================");
        //reverse1(test3);
        //System.out.println("==================");
        reverse1(test4);


    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逼哥很疯狂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值