码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] 670. Maximum Swap

时间:2021-03-18 14:32:17      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:bucket   i++   dig   new   not   swa   扫描   solution   http   

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]

最大交换。

给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。

思路是贪心,需要扫描两遍。首先我们把input的类型转换成charArray,这样方便之后的计算。同时我们需要一个长度为10的buckets,这样第一遍扫描input的时候,可以记录每个数字在 input 数字中最后一次出现的位置的下标。

再次扫描input,对于当前index指向的数字,如果有一个大于他的数字在其右边,那么我们就把他们swap一下;如果一直没有这样的条件出现,那么说明input数字是不需要swap的。

时间O(n)

空间O(n)

Java实现

 1 class Solution {
 2     public int maximumSwap(int num) {
 3         char[] digits = Integer.toString(num).toCharArray();
 4         int[] buckets = new int[10];
 5         // 记录每个不同数字最后一次出现的位置
 6         for (int i = 0; i < digits.length; i++) {
 7             buckets[digits[i] - ‘0‘] = i;
 8         }
 9 
10         // 再次扫描
11         // 对于每个数字,看是否有一个比当前这个数字更大的数字在右边,从9开始看
12         // 若有,就swap过来
13         for (int i = 0; i < digits.length; i++) {
14             for (int k = 9; k > digits[i] - ‘0‘; k--) {
15                 if (i < buckets[k]) {
16                     char temp = digits[i];
17                     digits[i] = digits[buckets[k]];
18                     digits[buckets[k]] = temp;
19                     return Integer.valueOf(new String(digits));
20                 }
21             }
22         }
23         return num;
24     }
25 }

 

LeetCode 题目总结

[LeetCode] 670. Maximum Swap

标签:bucket   i++   dig   new   not   swa   扫描   solution   http   

原文地址:https://www.cnblogs.com/cnoodle/p/14553039.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!