Skip to content

Commit 04de196

Browse files
committed
一刷670
1 parent acb701a commit 04de196

File tree

5 files changed

+132
-32
lines changed

5 files changed

+132
-32
lines changed

README.adoc

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4716,13 +4716,13 @@ TIP: **公众号的微信号是: `jikerizhi`**。__因为众所周知的原因
47164716
|Easy
47174717
|
47184718

4719-
//|{counter:codes}
4720-
//|{leetcode_base_url}/maximum-swap/[670. Maximum Swap^]
4721-
//|{source_base_url}/_0670_MaximumSwap.java[Java]
4722-
//|{doc_base_url}/0670-maximum-swap.adoc[题解]
4723-
//|Medium
4724-
//|
4725-
//
4719+
|{counter:codes}
4720+
|{leetcode_base_url}/maximum-swap/[670. Maximum Swap^]
4721+
|{source_base_url}/_0670_MaximumSwap.java[Java]
4722+
|{doc_base_url}/0670-maximum-swap.adoc[题解]
4723+
|Medium
4724+
|
4725+
47264726
//|{counter:codes}
47274727
//|{leetcode_base_url}/second-minimum-node-in-a-binary-tree/[671. Second Minimum Node In a Binary Tree^]
47284728
//|{source_base_url}/_0671_SecondMinimumNodeInABinaryTree.java[Java]

docs/0670-maximum-swap.adoc

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,64 @@
11
[#0670-maximum-swap]
2-
= 670. Maximum Swap
2+
= 670. 最大交换
33

4-
{leetcode}/problems/maximum-swap/[LeetCode - Maximum Swap^]
4+
https://leetcode.cn/problems/maximum-swap/[LeetCode - 670. 最大交换 ^]
55

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

7-
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.
8+
*示例 1 :*
89

10+
....
11+
输入: 2736
12+
输出: 7236
13+
解释: 交换数字2和数字7。
14+
....
915

10-
*Example 1:*
16+
*示例 2 :*
1117

18+
....
19+
输入: 9973
20+
输出: 9973
21+
解释: 不需要交换。
22+
....
1223

13-
[subs="verbatim,quotes,macros"]
14-
----
15-
*Input:* 2736
16-
*Output:* 7236
17-
*Explanation:* Swap the number 2 and the number 7.
18-
----
19-
20-
21-
*Example 2:*
22-
23-
24-
[subs="verbatim,quotes,macros"]
25-
----
26-
*Input:* 9973
27-
*Output:* 9973
28-
*Explanation:* No swap.
29-
----
30-
24+
*注意:*
3125

26+
. 给定数字的范围是 `[0, 10^8^]`
3227

33-
*Note:*
3428

35-
. The given number is in the range [0, 10^8^]
29+
== 思路分析
3630

31+
如何进行“最大交换”?其实很简单:从后面的数字中,找出一个最大数与最高位进行交换。如果后面的最大数小于等于最高位的数字,则把最高位“向后”移一位,再从剩下的数字中寻找最大的数字。
3732

33+
有一点需要特别注意,如果后面的数字的最大数存在多个,则最高位需要跟最低位的数字进行交换。(保持高位的最大数字不变,可以保证数字更大。)
3834

35+
网友对贪心算法的一句话总结:每一位数字应该不小于所有排它后面的数字,否则找最大的且排最后面的数字与之交换。
3936

4037
[[src-0670]]
38+
[tabs]
39+
====
40+
一刷::
41+
+
42+
--
4143
[{java_src_attr}]
4244
----
4345
include::{sourcedir}/_0670_MaximumSwap.java[tag=answer]
4446
----
47+
--
48+
49+
// 二刷::
50+
// +
51+
// --
52+
// [{java_src_attr}]
53+
// ----
54+
// include::{sourcedir}/_0670_MaximumSwap_2.java[tag=answer]
55+
// ----
56+
// --
57+
====
58+
59+
60+
== 参考资料
4561

62+
. https://leetcode.cn/problems/maximum-swap/solutions/1818457/zui-da-jiao-huan-by-leetcode-solution-lnd5/[670. 最大交换 - 官方题解^] -- 代码更简介。
63+
. https://leetcode.cn/problems/maximum-swap/solutions/2614470/yi-ci-bian-li-jian-ji-xie-fa-pythonjavac-c9b1/[670. 最大交换 - 一次遍历,简洁写法^]
64+
. https://leetcode.cn/problems/maximum-swap/solutions/1820042/by-muse-77-hwnt/[670. 最大交换 - 【爪哇缪斯】图解LeetCode^]

docs/index.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1422,7 +1422,7 @@ include::0662-maximum-width-of-binary-tree.adoc[leveloffset=+1]
14221422

14231423
include::0669-trim-a-binary-search-tree.adoc[leveloffset=+1]
14241424

1425-
// include::0670-maximum-swap.adoc[leveloffset=+1]
1425+
include::0670-maximum-swap.adoc[leveloffset=+1]
14261426

14271427
// include::0671-second-minimum-node-in-a-binary-tree.adoc[leveloffset=+1]
14281428

logbook/202503.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,11 @@ endif::[]
538538
|{doc_base_url}/0649-dota2-senate.adoc[题解]
539539
|✅ 贪心算法。优先禁止最近的对方议员投票。不停循环,直到只留下一方议员。
540540

541+
|{counter:codes2503}
542+
|{leetcode_base_url}/maximum-swap/[670. 最大交换^]
543+
|{doc_base_url}/0670-maximum-swap.adoc[题解]
544+
|✅ 贪心算法。最高位尽可能跟后面的最大数字进行交换。
545+
541546
|===
542547

543548
截止目前,本轮练习一共完成 {codes2503} 道题。
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class _0670_MaximumSwap {
7+
// tag::answer[]
8+
9+
/**
10+
* @author D瓜哥 · https://www.diguage.com
11+
* @since 2025-04-28 23:00:28
12+
*/
13+
public int maximumSwap(int num) {
14+
List<Integer> digits = getDigits(num);
15+
if (digits.size() < 2) {
16+
return num;
17+
}
18+
// 不标注是否交换,只击败了 31%,加后,击败 100%
19+
boolean swapped = false;
20+
for (int i = digits.size() - 1; i > 0; i--) {
21+
int idx = getMaxNumIndex(digits, i - 1);
22+
if (digits.get(idx) > digits.get(i)) {
23+
int tmp = digits.get(i);
24+
digits.set(i, digits.get(idx));
25+
digits.set(idx, tmp);
26+
swapped = true;
27+
break;
28+
}
29+
}
30+
if (swapped) {
31+
return digitToNum(digits);
32+
} else {
33+
return num;
34+
}
35+
}
36+
37+
private int digitToNum(List<Integer> digits) {
38+
int result = digits.getLast();
39+
for (int i = digits.size() - 2; i >= 0; i--) {
40+
result *= 10;
41+
result += digits.get(i);
42+
}
43+
return result;
44+
}
45+
46+
private int getMaxNumIndex(List<Integer> digits, int index) {
47+
int max = Integer.MIN_VALUE;
48+
int result = -1;
49+
for (int i = 0; i <= index; i++) {
50+
if (max < digits.get(i)) {
51+
max = digits.get(i);
52+
result = i;
53+
}
54+
}
55+
return result;
56+
}
57+
58+
private List<Integer> getDigits(int num) {
59+
List<Integer> result = new ArrayList<>();
60+
if (num == 0) {
61+
result.add(0);
62+
return result;
63+
}
64+
while (num > 0) {
65+
int digit = num % 10;
66+
result.add(digit);
67+
num /= 10;
68+
}
69+
return result;
70+
}
71+
// end::answer[]
72+
73+
public static void main(String[] args) {
74+
new _0670_MaximumSwap().maximumSwap(2736);
75+
}
76+
}

0 commit comments

Comments
 (0)