当前位置: 面试刷题>> 最大的交换 (经典算法题500道)


### 完整的题目描述 **题目:最大的交换** 给定一个非负整数,你可以至多交换一次数字中的两个不同数位上的数字。你的目标是得到可能的最大数。 **注意**: - 输入的数不包含前导零。 - 你可以假设除了数字 0 之外,不存在其他含前导零的情况。 **示例 1**: ``` 输入: 2736 输出: 7236 解释: 交换数字2和数字7。 ``` **示例 2**: ``` 输入: 9973 输出: 9973 解释: 不需要交换。 ``` **示例 3**: ``` 输入: 9861 输出: 9816 解释: 交换数字6和数字1。 ``` ### PHP 示例代码 ```php function maximumSwap($num) { $digits = str_split($num); $n = count($digits); $maxDigitPos = array_fill(0, $n, -1); // 记录每个位置之后最大的数字及其位置 $maxDigit = PHP_INT_MIN; // 从右向左遍历,找到每个位置之后最大的数字及其位置 for ($i = $n - 1; $i >= 0; $i--) { if ($digits[$i] > $maxDigit) { $maxDigit = $digits[$i]; } $maxDigitPos[$i] = $maxDigit; } // 从左向右遍历,寻找可以交换的最大数字 for ($i = 0; $i < $n; $i++) { if ($digits[$i] !== $maxDigitPos[$i]) { // 找到第一个不等于当前位置之后最大数字的位置,进行交换 for ($j = $n - 1; $j >= 0; $j--) { if ($digits[$j] == $maxDigitPos[$i]) { // 交换 list($digits[$i], $digits[$j]) = array($digits[$j], $digits[$i]); return implode('', $digits); } } } } // 如果没有找到可以交换的位置,则返回原数字 return $num; } // 测试 echo maximumSwap(2736); // 输出 7236 echo maximumSwap(9973); // 输出 9973 echo maximumSwap(9861); // 输出 9816 ``` ### Python 示例代码 ```python def maximumSwap(num): digits = list(str(num)) n = len(digits) max_digit_pos = [-1] * n # 记录每个位置之后最大的数字及其位置 max_digit = float('-inf') # 从右向左遍历,找到每个位置之后最大的数字及其位置 for i in range(n - 1, -1, -1): if digits[i] > max_digit: max_digit = digits[i] max_digit_pos[i] = max_digit # 从左向右遍历,寻找可以交换的最大数字 for i in range(n): if digits[i] != max_digit_pos[i]: for j in range(n): if digits[j] == max_digit_pos[i]: digits[i], digits[j] = digits[j], digits[i] return int(''.join(digits)) # 如果没有找到可以交换的位置,则返回原数字 return num # 测试 print(maximumSwap(2736)) # 输出 7236 print(maximumSwap(9973)) # 输出 9973 print(maximumSwap(9861)) # 输出 9816 ``` ### JavaScript 示例代码 ```javascript function maximumSwap(num) { const digits = num.toString().split(''); const n = digits.length; const maxDigitPos = new Array(n).fill(-1); // 记录每个位置之后最大的数字及其位置 let maxDigit = -Infinity; // 从右向左遍历,找到每个位置之后最大的数字及其位置 for (let i = n - 1; i >= 0; i--) { if (digits[i] > maxDigit) { maxDigit = digits[i]; } maxDigitPos[i] = maxDigit; } // 从左向右遍历,寻找可以交换的最大数字 for (let i = 0; i < n; i++) { if (digits[i] !== maxDigitPos[i]) { for (let j = n - 1; j >= 0; j--) { if (digits[j] === maxDigitPos[i]) { // 交换 [digits[i], digits[j]] = [digits[j], digits[i]]; return parseInt(digits.join('')); } } } } // 如果没有找到可以交换的位置,则返回原数字 return num; } // 测试 console.log(maximumSwap(2736)); // 输出 7236 console.log(maximumSwap(9973)); // 输出 9973 console.log(maximumSwap(9861)); // 输出 9816 ``` **码小课**网站中有更多相关内容分享给大家学习,涵盖了各种算法和数据结构的深入解析与实战应用。
推荐面试题