蓝桥杯试题:整数反转

一、题目要求:

给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零

二、题目分析+代码演示:

该程序的主要功能是接收一个整数输入,并将其各个位上的数字进行反转,生成一个新的整数。例如,输入`123`,输出`321`;输入`-380`,输出`-83`。

java 复制代码
import java.util.Scanner;

import static java.lang.Integer.valueOf;

public class Main {
 public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        if (num >= 0){
            StringBuilder sb = new StringBuilder();
            sb.append(num);
            StringBuilder sb1 = sb.reverse();
            String sb2 = sb1.toString();
            int num1 = valueOf(sb2);
            System.out.println(num1);
        }
        else {
            String str = num + "";
            String str1 = str.substring(1,str.length());
            StringBuilder str2 = new StringBuilder();
            str2.append(str1);
            StringBuilder str3 = str2.reverse();
            String str4 = str3.toString();
            int m = Integer.valueOf(str4);
            m = -m;
            System.out.println(m);
        }

    }


 }

说明:

处理负数的情况中有两点需要注意:

1.String str = num + "";

将负数`num`转换为字符串`str`。例如,-456转换为"-456"。

为什么要这样用?

  1. 将整数转换为字符串:

在Java中,直接对整数进行反转操作并不直观。因此,通常的做法是将整数转换为字符串,然后对字符串进行反转,最后再将反转后的字符串转换回整数。

`num + ""` 是一种简便的方法,将整数 `num` 转换为对应的字符串表示。例如,-123 会被转换为字符串 "-123"。

  1. 方便截取数字部分:

对于负数,字符串表示以 `-` 开头。为了反转数字部分,需要去掉这个负号,只反转数字。使用 `substring(1, str.length())` 可以轻松实现这一点,得到 `"123"`。
这种做法的优缺点:

优点:

**简单直观**:对于初学者来说,这种方法易于理解和实现。

**快速实现**:无需额外的库函数或复杂的逻辑,即可实现数字反转。

缺点:

**效率较低**:字符串操作在Java中相对较慢,尤其是对于大数或频繁的操作时。

**可读性差**:`num + ""` 这种写法不够明确,可能会让阅读代码的人感到困惑。

**潜在的错误风险**:如果 `num` 为 `0`,`num + ""` 会得到 `"0"`,这在某些情况下可能需要额外处理。

  1. String str1 = str.substring(1, str.length());

使用`substring`方法从索引1开始截取字符串,去掉负号。例如,"-456"变为"456"。

三、优化

虽然上述代码能够实现功能,但有一些可以优化的地方:

  1. 处理负数的简化

可以统一处理正数和负数,无需分开判断。例如,先记录符号,再处理绝对值部分。

  1. 防止溢出

在将反转后的字符串转换为整数时,可能会发生溢出(例如,反转`Integer.MAX_VALUE`)。可以在转换前进行范围检查。

  1. 使用更简洁的方法

可以利用数学运算来反转数字,避免字符串操作,提高效率。

java 复制代码
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int num = sc.nextInt();
    int reversed = reverseInteger(num);
    System.out.println(reversed);
}

public static int reverseInteger(int x) {
    int reversed = 0;
    while (x != 0) {
        int pop = x % 10;
        x /= 10;
        // 检查是否会溢出
        if (reversed > Integer.MAX_VALUE/10 || (reversed == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
        if (reversed < Integer.MIN_VALUE/10 || (reversed == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
        reversed = reversed * 10 + pop;
    }
    return reversed;
}

说明:

  1. 统一处理正负数

通过取模运算`x % 10`,可以同时处理正数和负数。

  1. 防止溢出

在每次更新`reversed`之前,检查是否会导致整数溢出。如果会,则返回0。

  1. 数学运算反转数字

通过不断取出最后一位数字并构建反转后的数字,避免了字符串操作,提高了效率。

相关推荐
Boilermaker19925 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
Cherry的跨界思维5 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
MM_MS5 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
꧁Q༒ོγ꧂6 小时前
LaTeX 语法入门指南
开发语言·latex
njsgcs6 小时前
ue python二次开发启动教程+ 导入fbx到指定文件夹
开发语言·python·unreal engine·ue
alonewolf_996 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子6 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
sheji34166 小时前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java
古城小栈6 小时前
Rust 迭代器产出的引用层数——分水岭
开发语言·rust
ghie90906 小时前
基于MATLAB的TLBO算法优化实现与改进
开发语言·算法·matlab