leetcode 670 [medium]
中:最大交换
英:Maximum Swap
题解
1. 思路
- 要使得交换后数最大,那么就要让当前数中的未处于尽可能高位的最大的数字字符交换到尽可能更高位
例如对于937
,9
是最大数字字符,但已经处于尽可能高位,而7
是当前未处于尽可能高位的最大的数字字符 - 当满足 “未处于尽可能高位的最大的数字字符” 有多个时,要尽量选择原本处以更低位的
例如对于9377
,我们选择交换个位的7
而不是十位的7
2. 步骤(栈 + 贪心)
- 从末尾遍历num各位,若当前元素比栈顶元素大(空栈直接入栈),入栈。直到num头或者当前位为9。
- 从起始遍历num各位,比较当前位于栈顶元素的大小和位置关系
(1)若当前元素比栈顶元素小,且满足当前元素在高位,栈顶元素在低位,则交换,返回结果;
(2)若不满足高低位关系,则栈顶元素出栈,继续比较;
(3)若栈为空,说明无需交换;
3. 时间复杂度:O(n)
4. 空间复杂度:O(1) 栈空间,最多只有10个元素
5. 实现
/**
* @param {number} num
* @return {number}
*/
var maximumSwap = function(num)