题目;
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736 输出: 7236 解释: 交换数字2和数字7。
示例 2 :
输入: 9973 输出: 9973 解释: 不需要交换。
注意:
- 给定数字的范围是 [0, 108]
解题:
-
转换表示:
将输入的非负整数num
转换为字符数组digits
,便于我们检查每一位数字并在之后进行交换。 -
建立索引表:
创建一个数组last
来记录每个数字0-9在字符数组digits
中出现的最后位置。这样我们就可以快速定位到在进行交换时可用的最大数字的位置。 -
查找交换位置:
从字符数组digits
的最左端(最高位)开始遍历,对每个当前位置i
, 我们从数字9递减至当前数字,检查是否有比当前数字大的数字出现在其之后的位置上。这是通过检查索引表last
与当前位置i
来确定的。 -
确定交换策略:
一旦我们找到一个比当前数字digits[i]
大且在其后面的数字,则将当前数字与这个找到的最大数字进行交换。因为我们要获取可能的最大值,所以我们总是优先选择最大的可交换数字。 -
执行交换并返回结果:
进行交换后,我们将字符数组转回整数并返回结果。如果遍历整个数组都没有找到可交换的位置,则表示原数字已经是最大值,直接返回原始整数。
代码:
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编程知识点:
-
类和方法定义:定义了一个名为
Solution
的类和一个名为maximumSwap
的方法,它接收一个int
类型的参数并返回一个int
类型的结果,遵循了基本的面向对象编程原则。 -
字符数组:使用
Integer.toString(num).toCharArray()
将整数num
转换成对应的字符数组,每个字符表示一个数字位。 -
数组:定义了一个名为
last
的整数数组来存储每个数字字符最后出现的索引位置。 -
循环控制结构:代码中使用了
for
循环遍历字符数组和查找数字位。 -
条件控制结构:使用
if
条件语句来判断是否存在一个较大位在当前位数字后面的情况,以此决定是否执行交换。 -
ASCII码:利用字符 '0' 的ASCII值作为参考,对字符数组中的数值字符进行ASCII计算,将字符转换为相应的整数值。
-
字符串拼接与转换:基于字符数组创建了一个新的字符串,并把交换完的字符数组转换回整数。
-
返回语句:在找到可以交换的两个数字并交换后,返回新构造的整数,或者在无需交换的情况下返回原始整数。
知识点 | 详细描述 |
---|---|
类和方法定义 | 在 Solution 类中定义了 maximumSwap 方法,此方法执行主要的操作。 |
字符数组 | 使用 toCharArray() 方法将数字转换为它们的字符表示形式,方便操作每个单独的数字。 |
数组 | 定义了一个名为 last 的数组,用于存储每个数字最后一次出现的索引位置。 |
循环控制结构 | 使用 for 循环来迭代字符数组以及从9遍历到0寻找可以交换的数字。 |
条件控制结构 | 使用 if 语句来检查特定条件是否满足,并在条件为真时执行代码块。 |
ASCII码操作 | 操作字符与数字之间的转换,利用 '0' 字符的ASCII值计算。 |
字符串拼接与转换 | 通过 new String(digits) 将字符数组转换回字符串,然后用 Integer.parseInt() 将字符串转换为整数。 |
返回语句 | 在方法的末尾返回要么是经过交换的新数值,要么是原始的输入数值。 |
2024.5.16