Skip to content

Commit 9aaf89a

Browse files
committed
fd
1 parent 4fc3a7f commit 9aaf89a

File tree

3 files changed

+99
-51
lines changed

3 files changed

+99
-51
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,5 +382,6 @@
382382
|653|[Two Sum IV - Input is a BST](https://leetcode.com/problems/two-sum-iv-input-is-a-bst/)| [Java](leetcode/solution/src/TwoSumIV.java)|90||
383383
|654|[Maximum Binary Tree](https://leetcode.com/problems/maximum-binary-tree/description/)|[Java](leetcode/solution/src/MaximumBinaryTree.java)|100||
384384
|669|[Trim a Binary Search Tree](https://leetcode.com/problems/trim-a-binary-search-tree/)|[Java](leetcode/solution/src/TrimABinarySearchTree.java)|100||
385+
|681|[Next Closest Time](https://leetcode.com/problems/next-closest-time/)|[Java](leetcode/solution/src/NextClosestTime.java)|80|这题多做几遍|
385386
|684|[Redundant Connection](https://leetcode.com/problems/redundant-connection/)| [Java](leetcode/solution/src/RedundantConnection.java)|||
386387
|771|[Jewels and Stones](https://leetcode.com/problems/jewels-and-stones/)|[Java](leetcode/solution/src/JewelsAndStones.java)|100||
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import java.util.Arrays;
2+
import java.util.TreeSet;
3+
4+
public class NextClosestTime {
5+
6+
/**
7+
* 整体思路如下:
8+
* 首先对输入的时间所包含的数要统计一下,并从小到大排序
9+
* 接下来从时间的高位开始,寻找可替代的更大的数,如果找不到,就看下一位,如果找到了就替换成该数,判断时间是否有效
10+
* 如果有效,则将该位往上全部替换为全局最小的数,并返回结果。否则还原该位,并继续看下一位。
11+
*/
12+
public String nextClosestTime(String time) {
13+
int[] number = new int[4];
14+
15+
time = time.substring(0, 2) + time.substring(3);
16+
17+
for (int i = 0; i < time.length(); i++) {
18+
number[i] = time.charAt(i) - '0';
19+
}
20+
21+
Arrays.sort(number);
22+
23+
StringBuilder sb = new StringBuilder(time);
24+
25+
int i;
26+
for (i = 3; i >= 0; i--) {
27+
char c = time.charAt(i);
28+
int k = nextNumber(number, c - '0');
29+
if (k >= 0) {
30+
sb.setCharAt(i, (char) (k + '0'));
31+
if (isValid(sb)) {
32+
break;
33+
}
34+
sb.setCharAt(i, c);
35+
}
36+
}
37+
for (i++; i < 4; i++) {
38+
sb.setCharAt(i, (char) (number[0] + '0'));
39+
}
40+
sb.insert(2, ':');
41+
return sb.toString();
42+
}
43+
44+
// 判断时间是否有效
45+
private boolean isValid(StringBuilder sb) {
46+
boolean flag1 = sb.charAt(0) < '2' || (sb.charAt(0) == '2' && sb.charAt(1) <= '3');
47+
boolean flag2 = sb.charAt(2) < '5' || (sb.charAt(2) == '5' && sb.charAt(3) <= '9');
48+
return flag1 && flag2;
49+
}
50+
51+
/**
52+
* 找比n更大的数,number是一个升序的数组
53+
*/
54+
private int nextNumber(int[] number, int n) {
55+
for (int i = 0; i < number.length; i++) {
56+
if (number[i] > n) {
57+
return number[i];
58+
}
59+
}
60+
return -1;
61+
}
62+
}

leetcode/src/Main.java

Lines changed: 36 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,70 +2,55 @@
22

33
public class Main {
44

5-
public int search(int[] nums, int target) {
6-
int left = 0, right = nums.length - 1;
5+
public String nextClosestTime(String time) {
6+
int[] number = new int[4];
77

8-
while (left <= right) {
9-
int mid = left + (right - left) / 2;
8+
time = time.substring(0, 2) + time.substring(3);
109

11-
if (nums[left] < nums[mid]) {
12-
if (target >= nums[left] && target < nums[mid]) {
13-
right = mid - 1;
14-
} else if (target == nums[mid]) {
15-
return mid;
16-
} else {
17-
left = mid + 1;
18-
}
19-
} else if (nums[left] == nums[mid]) {
20-
if (target == nums[mid]) {
21-
return mid;
22-
} else {
23-
left++;
24-
}
25-
}
26-
else {
27-
if (target > nums[mid] && target <= nums[right]) {
28-
left = mid + 1;
29-
} else if (target == nums[mid]) {
30-
return mid;
31-
} else {
32-
right = mid - 1;
33-
}
34-
}
10+
for (int i = 0; i < time.length(); i++) {
11+
number[i] = time.charAt(i) - '0';
3512
}
3613

37-
return -1;
38-
}
14+
Arrays.sort(number);
3915

40-
// [3,1], 1
41-
public int search2(int[] nums, int target) {
42-
int left = 0, right = nums.length - 1;
16+
StringBuilder sb = new StringBuilder(time);
4317

44-
while (left <= right) {
45-
int mid = left + (right - left) / 2;
46-
47-
if (target == nums[mid]) {
48-
return mid;
49-
}
50-
51-
if (nums[left] <= nums[mid]) {
52-
if (target >= nums[left] && target < nums[mid]) {
53-
right = mid - 1;
54-
} else {
55-
left = mid + 1;
56-
}
57-
} else {
58-
if (target > nums[mid] && target <= nums[right]) {
59-
left = mid + 1;
60-
} else {
61-
right = mid - 1;
18+
int i;
19+
for (i = 3; i >= 0; i--) {
20+
char c = time.charAt(i);
21+
int k = nextNumber(number, c - '0');
22+
if (k >= 0) {
23+
sb.setCharAt(i, (char) (k + '0'));
24+
if (isValid(sb)) {
25+
break;
6226
}
27+
sb.setCharAt(i, c);
6328
}
6429
}
30+
for (i++; i < 4; i++) {
31+
sb.setCharAt(i, (char) (number[0] + '0'));
32+
}
33+
sb.insert(2, ':');
34+
return sb.toString();
35+
}
6536

37+
private boolean isValid(StringBuilder sb) {
38+
boolean flag1 = sb.charAt(0) < '2' || (sb.charAt(0) == '2' && sb.charAt(1) <= '3');
39+
boolean flag2 = sb.charAt(2) < '5' || (sb.charAt(2) == '5' && sb.charAt(3) <= '9');
40+
return flag1 && flag2;
41+
}
42+
43+
private int nextNumber(int[] number, int n) {
44+
for (int i = 0; i < number.length; i++) {
45+
if (number[i] > n) {
46+
return number[i];
47+
}
48+
}
6649
return -1;
6750
}
6851

6952
public static void main(String[] args) {
53+
String s = new NextClosestTime().nextClosestTime("13:55");
54+
System.out.println(s);
7055
}
7156
}

0 commit comments

Comments
 (0)