返回
Java&C++题解与拓展——leetcode670.最大交换【什么知识点】
后端
2024-02-04 16:05:53
在leetcode670.最大交换题目中,我们要求在给定的数字中找到最大交换,并返回由交换后的数字组成的最大数字。例如,对于数字123,最大交换是321。
我们可以使用贪心算法来解决这个问题。贪心算法是一种在每一步中都做出局部最优选择,以期得到全局最优解的算法。在这个问题中,我们可以贪婪地选择每一步中最大的数字与最小的数字进行交换。
以下是使用Java、C++和Rust三种语言编写的代码:
Java代码:
public class Solution {
public int maximumSwap(int num) {
char[] arr = String.valueOf(num).toCharArray();
int[] last = new int[10];
for (int i = 0; i < arr.length; i++) {
last[arr[i] - '0'] = i;
}
for (int i = 0; i < arr.length; i++) {
for (int j = 9; j > arr[i] - '0'; j--) {
if (last[j] > i) {
char temp = arr[i];
arr[i] = arr[last[j]];
arr[last[j]] = temp;
return Integer.parseInt(new String(arr));
}
}
}
return num;
}
}
C++代码:
class Solution {
public:
int maximumSwap(int num) {
string s = to_string(num);
int n = s.size();
int last[10];
for (int i = 0; i < n; i++) {
last[s[i] - '0'] = i;
}
for (int i = 0; i < n; i++) {
for (int j = 9; j > s[i] - '0'; j--) {
if (last[j] > i) {
swap(s[i], s[last[j]]);
return stoi(s);
}
}
}
return num;
}
};
Rust代码:
impl Solution {
pub fn maximum_swap(num: i32) -> i32 {
let mut s = num.to_string();
let mut n = s.len();
let mut last = vec![0; 10];
for i in 0..n {
last[s.as_bytes()[i] as usize - '0' as usize] = i;
}
for i in 0..n {
for j in (s.as_bytes()[i] as usize + 1)..10 {
if last[j] > i {
s.as_bytes_mut()[i] = j as u8;
s.as_bytes_mut()[last[j]] = s.as_bytes()[i];
return s.parse::<i32>().unwrap();
}
}
}
num
}
}
除了上述代码外,我们还可以使用C#、Python等其他语言来编写代码。
希望本文对您有所帮助。如果您有任何疑问,请随时留言。