每日一练 2025.5.16

题目;

给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。

示例 1 :

输入: 2736
输出: 7236
解释: 交换数字2和数字7。

示例 2 :

输入: 9973
输出: 9973
解释: 不需要交换。

注意:

  1. 给定数字的范围是 [0, 108]
解题:
  1. 转换表示
    将输入的非负整数num转换为字符数组digits,便于我们检查每一位数字并在之后进行交换。

  2. 建立索引表
    创建一个数组last来记录每个数字0-9在字符数组digits中出现的最后位置。这样我们就可以快速定位到在进行交换时可用的最大数字的位置。

  3. 查找交换位置
    从字符数组digits的最左端(最高位)开始遍历,对每个当前位置i, 我们从数字9递减至当前数字,检查是否有比当前数字大的数字出现在其之后的位置上。这是通过检查索引表last与当前位置i来确定的。

  4. 确定交换策略
    一旦我们找到一个比当前数字digits[i]大且在其后面的数字,则将当前数字与这个找到的最大数字进行交换。因为我们要获取可能的最大值,所以我们总是优先选择最大的可交换数字。

  5. 执行交换并返回结果
    进行交换后,我们将字符数组转回整数并返回结果。如果遍历整个数组都没有找到可交换的位置,则表示原数字已经是最大值,直接返回原始整数。

代码:
class Solution {
    public int maximumSwap(int num) {
        char[] digits = Integer.toString(num).toCharArray();

        // 储存每个数字最后一次出现的位置
        int[] last = new int[10];
        for (int i = 0; i < digits.length; i++) {
            last[digits[i] - '0'] = i;
        }

        // 从左向右遍历所有的数字
        for (int i = 0; i < digits.length; i++) {
            // 从9开始向下查找,找到第一个在当前数字之后出现的最大数字
            for (int d = 9; d > digits[i] - '0'; d--) {
                if (last[d] > i) {
                    // 发现可以交换的两个数字,进行交换
                    char temp = digits[i];
                    digits[i] = digits[last[d]];
                    digits[last[d]] = temp;
                    // 返回交换后的新数字
                    return Integer.parseInt(new String(digits));
                }
            }
        }

        // 如果没有交换发生,直接返回原数字
        return num;
    }
}
知识点解析:

这段代码使用了以下Java编程知识点:

  1. 类和方法定义:定义了一个名为 Solution 的类和一个名为 maximumSwap 的方法,它接收一个 int 类型的参数并返回一个 int 类型的结果,遵循了基本的面向对象编程原则。

    public class Solution {
        public int maximumSwap(int num) {
            // 方法体
        }
    }
  2. 字符数组:使用 Integer.toString(num).toCharArray() 将整数 num 转换成对应的字符数组,每个字符表示一个数字位。

    char[] digits = Integer.toString(num).toCharArray();
  3. 数组:定义了一个名为 last 的整数数组来存储每个数字字符最后出现的索引位置。

    int[] last = new int[10]; // 存储数字0-9最后出现的索引
  4. 循环控制结构:代码中使用了 for 循环遍历字符数组和查找数字位。

    for (int i = 0; i < digits.length; i++) {
        // 循环体
    }
  5. 条件控制结构:使用 if 条件语句来判断是否存在一个较大位在当前位数字后面的情况,以此决定是否执行交换。

    if (digits[i] > digits[last[digit]]) {
        // 执行交换操作
    }
  6. ASCII码:利用字符 '0' 的ASCII值作为参考,对字符数组中的数值字符进行ASCII计算,将字符转换为相应的整数值。

  7. 字符串拼接与转换:基于字符数组创建了一个新的字符串,并把交换完的字符数组转换回整数。

    String newNumber = new String(digits); // 从字符数组创建字符串
    int result = Integer.parseInt(newNumber); // 字符串转换为整数
  8. 返回语句:在找到可以交换的两个数字并交换后,返回新构造的整数,或者在无需交换的情况下返回原始整数。

知识点详细描述
类和方法定义在 Solution 类中定义了 maximumSwap 方法,此方法执行主要的操作。
字符数组使用 toCharArray() 方法将数字转换为它们的字符表示形式,方便操作每个单独的数字。
数组定义了一个名为 last 的数组,用于存储每个数字最后一次出现的索引位置。
循环控制结构使用 for 循环来迭代字符数组以及从9遍历到0寻找可以交换的数字。
条件控制结构使用 if 语句来检查特定条件是否满足,并在条件为真时执行代码块。
ASCII码操作操作字符与数字之间的转换,利用 '0' 字符的ASCII值计算。
字符串拼接与转换通过 new String(digits) 将字符数组转换回字符串,然后用 Integer.parseInt() 将字符串转换为整数。
返回语句在方法的末尾返回要么是经过交换的新数值,要么是原始的输入数值。

2024.5.16

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值