題目:
給定乙個非負整數,你至多可以交換一次數字中的任意兩位。返回你能得到的最大值
示例1:
輸入: 2736示例2:輸出: 7236
解釋: 交換數字2和數字7。
輸入: 9973思路:輸出: 9973
解釋: 不需要交換。
先根據給定的數字,把數字的每一位拆分並放到 list 集合中,並且利用list中的數字組合成最大的數字,再根據這個最大的數字,判斷原數字是否是最大數字,若不是找出應該交換的位置,進行交換即可。
class
solution
//建立兩個集合,乙個是按照原來數字的順序放到集合中;另乙個是利用將原來的數字組合成最大數字後的。
list
list1 =
newarraylist
<
>()
; list
list2 =
newarraylist
<
>()
;int result = num;
//分別把 num 的每一位放到 list1 和 list2 中。
while
(result >0)
//判斷原來的數字是否已經是最大數字了,如果是就將該數字直接返回。
boolean flag =
false
;for
(int i =
0; i < list1.
size()
-1; i++)}
if(flag ==
false
)//把 list1 集合中的數字按照降序排序
collections.
sort
(list1,
newcomparator
()if(o1 < o2)
return0;
}});
//找出組合成的最大數與原來數字中從高位開始,第乙個不同的數字,該數字就是需要交換的數字,
//而交換的數字是該數字後最大的數字。
int ret =0;
int i =0;
for(
; i < list2.
size()
; i++)}
//由於集合不可以直接進行交換,因此先把集合中的數字放到陣列中。
int[
] arr =
newint
[list1.
size()
];for(
int j =
0; j < list1.
size()
; j++
)// max 記錄需要交換數字後最大的數字,如果有多位,那麼就取最後面的
//那個數字(因為越往後面權重越低,所以要想獲得最大值,就要把後面大的數字往前面放)。
int max =0;
int w =0;
for(
int j = ret +
1; j < list2.
size()
; j++)}
//交換需要交換的數字
int tmp = arr[ret]
; arr[ret]
= arr[w]
; arr[w]
= tmp;
int cur =0;
int k =0;
//最後根據陣列中數字的順序轉換成為最終的數字。
for(
int j = arr.length -
1; j >=
0; j--
)return cur;
}}
LeetCode 670 最大交換
class solution 將num的各個位上的值存於向量中 int len res.size int k 0 for int i len 1 i 0 i 求出位置j i 1之前 包括j 的最大值 if res i 0 i 重新算出最大值 return n 思路 倒著推,因為將num值的各個位的值...
Leetcode 670 最大交換
給定乙個非負整數,你至多可以交換一次數字中的任意兩位。返回你能得到的最大值。class solution 以上幾句完全可以由下句替代 string b to string num for int i 0 i b temp if i temp b i b temp 再將b輸出成乙個數 以下幾句,完全可...
leetcode 670 最大交換(陣列)
1 將較大的數盡可能排前面 複雜度分析 時間複雜度 o n 2 空間複雜度 o n class solution 存在更大元素 2 排序 1 先得到排序後的字串s sort 逆序 2 從前到後比較s和sort,找到第乙個不同的位置i,其中s i s sort i 設char c s sort i 3...