博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] 670. Maximum Swap 最大置换
阅读量:4697 次
发布时间:2019-06-09

本文共 4095 字,大约阅读时间需要 13 分钟。

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: 2736Output: 7236Explanation: Swap the number 2 and the number 7.

Example 2:

Input: 9973Output: 9973Explanation: 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);    }

  

  

  

类似题目:

Create Maximum Number

  

 

转载于:https://www.cnblogs.com/lightwindy/p/9576624.html

你可能感兴趣的文章
仿复制粘贴功能,长按弹出tips的实现
查看>>
Kubernetes-Host网络模式应用
查看>>
第三次作业
查看>>
sqlplus terminators - Semicolumn (;), slash (/) and a blank line
查看>>
省选知识清单/计划列表(咕?)
查看>>
远程桌面(3389)复制(拖动)文件
查看>>
转 lucene3搜索引擎,索引建立搜索排序分页高亮显示, IKAnalyzer分词
查看>>
win10应用UserControl
查看>>
BZOJ4516: [Sdoi2016]生成魔咒(后缀自动机)
查看>>
查看手机已经记住的WIFI密码
查看>>
最新版IntelliJ IDEA2019 破解教程(2019.08.07-情人节更新)
查看>>
C# 两个datatable中的数据快速比较返回交集或差集
查看>>
关于oracle样例数据库emp、dept、salgrade的mysql脚本复杂查询分析
查看>>
adb shell am 的用法
查看>>
实现自动点击
查看>>
MVP开发模式的理解
查看>>
Unity多开的方法
查看>>
File类中的list()和listFiles()方法
查看>>
我的VS CODE插件配置 主要针对.NET和前端插件配置
查看>>
iOS10 UI教程视图和子视图的可见性
查看>>