zoukankan      html  css  js  c++  java
  • [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:

    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:

    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:

    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:

    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

    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++:

    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++:

        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 题目汇总

  • 相关阅读:
    23种设计模式-桥接模式
    23种设计模式-单列模式
    23种设计模式-迭代器模式
    23种设计模式-组合模式
    23种设计模式-备忘录模式
    23种设计模式-适配器模式
    23种设计模式-状态模式
    SVN的安装和应用
    线程、线程池
    条形码
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9576624.html
Copyright © 2011-2022 走看看