LeetCode 670 最大交換

2021-10-01 15:31:24 字數 1937 閱讀 4844

題目:

給定乙個非負整數,你至多可以交換一次數字中的任意兩位。返回你能得到的最大值

示例1:

輸入: 2736

輸出: 7236

解釋: 交換數字2和數字7。

示例2:

輸入: 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...