[LeetCode] 670. Maximum Swap 最大置换

Given a non-negative integer, you could swap two digits at most once to get the maximum valued number. Return the maximum valued number you could get.

Example 1:

Input: 2736
Output: 7236
Explanation: Swap the number 2 and the number 7.

Example 2:

Input: 9973
Output: 9973
Explanation: No swap.

Note:

  1. The given number is in the range [0, 108]

解法:从后向前扫,遇到比max_value 大的就记录这个最大数的值和位置,继续向前扫,遇到小于这个max_value时,就记录这个交换位置, 因为越往左扫数位越高,交换后整个数字值越大。 

Java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
    public int maximumSwap(int num) {
        char[] digits = Integer.toString(num).toCharArray();
         
        int[] buckets = new int[10];
        for (int i = 0; i < digits.length; i++) {
            buckets[digits[i] - '0'] = i;
        }
         
        for (int i = 0; i < digits.length; i++) {
            for (int k = 9; k > digits[i] - '0'; k--) {
                if (buckets[k] > i) {
                    char tmp = digits[i];
                    digits[i] = digits[buckets[k]];
                    digits[buckets[k]] = tmp;
                    return Integer.valueOf(new String(digits));
                }
            }
        }
         
        return num;
    }
}  

Python:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution(object):
    def maximumSwap(self, num):
        """
        :type num: int
        :rtype: int
        """
        digits = list(str(num))
        left, right = 0, 0
        max_idx = len(digits)-1
        for i in reversed(xrange(len(digits))):
            if digits[i] > digits[max_idx]:
                max_idx = i
            elif digits[max_idx] > digits[i]:
                left, right = i, max_idx
        digits[left], digits[right] = digits[right], digits[left]
        return int("".join(digits))

Python:

1
2
3
4
5
6
7
8
9
10
def maximumSwap(self, num):
    A = list(str(num))
    ans = A[:]
    for i in xrange(len(A)):
        for j in xrange(i+1, len(A)):
            A[i], A[j] = A[j], A[i]
            if A > ans: ans = A[:]
            A[i], A[j] = A[j], A[i]
 
    return int("".join(ans))

Python:

1
2
3
4
5
6
7
8
9
def maximumSwap(self, num):
    A = map(int, str(num))
    last = {x: i for i, x in enumerate(A)}
    for i, x in enumerate(A):
        for d in xrange(9, x, -1):
            if last.get(d, None) > i:
                A[i], A[last[d]] = A[last[d]], A[i]
                return int("".join(map(str, A)))
    return num 

Python: wo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution():
    def maxSwap(self, num):
        s = list(str(num))
        i = 0
        while i < len(s):
            j = i + 1
            swap = i
            mx = s[i]
            while j < len(s):
                if s[j] > mx:
                    mx = s[j]
                    swap = j
                j += 1
            if swap != i:
                s[i], s[swap] = s[swap], s[i]
                break
 
            i += 1
 
        return int(''.join(s))

C++:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
    int maximumSwap(int num) {
        string digits = to_string(num);
        int left = 0, right = 0;
        int max_idx = digits.length() - 1;
        for (int i = digits.length() - 1; i >= 0; --i) {
            if (digits[i] > digits[max_idx]) {
                max_idx = i;
            } else if (digits[max_idx] > digits[i]) {
                left = i;
                right = max_idx;
            }
        }
        swap(digits[left], digits[right]);
        return stoi(digits);
    }
};

C++:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int maximumSwap(int num) {
    string numstr = std::to_string(num);
 
    int maxidx = -1; int maxdigit = -1;
    int leftidx = -1; int rightidx = -1;       
 
    for (int i = numstr.size() - 1; i >= 0; --i) {
        // current digit is the largest by far
        if (numstr[i] > maxdigit) {
            maxdigit = numstr[i];
            maxidx = i;
            continue;
        }
 
        // best candidate for max swap if there is no more
        // such situation on the left side
        if (numstr[i] < maxdigit) {
            leftidx = i;
            rightidx = maxidx;
        }
    }
 
    // num is already in order
    if (leftidx == -1) return num;
 
    std::swap(numstr[leftidx], numstr[rightidx]);
 
    return std::stoi(numstr);
}

  

  

  

类似题目:

[LeetCode] 31. Next Permutation 下一个排列

Create Maximum Number

  

All LeetCode Questions List 题目汇总

 

posted @   轻风舞动  阅读(1071)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示