Skip to content

Commit 5efbe97

Browse files
refactor 386
1 parent b0983ef commit 5efbe97

File tree

1 file changed

+28
-95
lines changed
  • src/main/java/com/fishercoder/solutions

1 file changed

+28
-95
lines changed
Lines changed: 28 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,107 +1,40 @@
11
package com.fishercoder.solutions;
22

33
import java.util.ArrayList;
4-
import java.util.Collections;
5-
import java.util.Comparator;
6-
import java.util.Date;
74
import java.util.List;
85

96
/**
7+
* 386. Lexicographical Numbers
8+
*
109
* Given an integer n, return 1 - n in lexicographical order.
11-
12-
For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].
13-
14-
Please optimize your algorithm to use less time and space. The input size may be as large as 5,000,000.*/
10+
*
11+
* For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].
12+
*
13+
* Please optimize your algorithm to use less time and space. The input size may be as large as
14+
* 5,000,000.
15+
*/
1516
public class _386 {
16-
//Radix sort doesn't apply here! Don't confuse myself!
17-
18-
//rewrote their solution from Python to Java:https://discuss.leetcode.com/topic/54986/python-memory-limit-exceeded-for-problem-386/17
19-
public static List<Integer> lexicalOrder(int n) {
20-
List<Integer> result = new ArrayList();
21-
int i = 1;
22-
while (true) {
23-
result.add(i);
24-
if (i * 10 <= n) {
25-
i *= 10;
26-
} else {
27-
while (i % 10 == 9 || i == n) {
28-
i /= 10;
29-
}
30-
if (i == 0) {
31-
return result;
32-
}
33-
i++;
34-
}
35-
}
36-
}
37-
38-
//someone on Discuss hinted that you could use recursion to solve it in Java
39-
//then I wrote the following method, eventually, got all test cases produce the right output, but unfortunately TLE'ed by OJ
40-
public static List<Integer> lexicalOrder_LTE_by_10458(int n) {
41-
List<Integer> result = new ArrayList();
42-
int insertPosition = 0;
43-
return addNumbers(result, 1, insertPosition, n);
44-
}
45-
46-
private static List<Integer> addNumbers(List<Integer> result, int insertNumber, int insertPosition, int n) {
47-
int i;
48-
for (i = 0; i < 9; i++) {
49-
if (insertNumber + i > n) {
50-
return result;
51-
}
52-
result.add(insertPosition + i, insertNumber + i);
53-
if ((insertNumber + i) % 10 == 0 && (insertNumber + i) == (insertNumber + 10)) {
54-
break;
55-
}
56-
}
57-
while ((insertNumber + i) % 10 != 0 && (insertNumber + i) <= n) {
58-
result.add(insertPosition + i, insertNumber + i);
59-
i++;
60-
}
61-
//find next insert position:
62-
insertPosition = result.indexOf((insertNumber + i) / 10);
63-
return addNumbers(result, insertNumber + i, insertPosition + 1, n);
64-
}
65-
66-
public static void main(String... strings) {
67-
long lStartTime = new Date().getTime();
17+
public static class Solution1 {
18+
//Radix sort doesn't apply here! Don't confuse yourself!
6819

69-
// CommonUtils.printList(lexicalOrder_TLE_by_23489(23489));
70-
// List<Integer> result = lexicalOrder(1);//right
71-
// List<Integer> result = lexicalOrder(13);//right
72-
// List<Integer> result = lexicalOrder_LTE_by_10458(58);
73-
// List<Integer> result = lexicalOrder(120);//right
74-
// List<Integer> result = lexicalOrder(1200);
75-
// List<Integer> result = lexicalOrder(10);
76-
// List<Integer> result = lexicalOrder(5000000);
77-
// List<Integer> result = lexicalOrder_LTE_by_10458(50000);//this can finish in 183 ms
78-
List<Integer> result = lexicalOrder_LTE_by_10458(500000);
79-
// List<Integer> result = lexicalOrder_LTE_by_10458(14959);
80-
long lEndTime = new Date().getTime();
81-
long difference = lEndTime - lStartTime;
82-
System.out.println("Elapsed milliseconds: " + difference);
83-
System.out.println("result size is: " + result.size());
84-
// CommonUtils.printList(result);
85-
}
86-
87-
/**
88-
* The most naive way is to generate this list, sort it using a customized comparator and then return it.
89-
* Unfortunately, this results in TLE with this input: 23489
90-
*/
91-
public static List<Integer> lexicalOrder_TLE_by_23489(int n) {
92-
List<Integer> result = new ArrayList();
93-
for (int i = 1; i <= n; i++) {
94-
result.add(i);
20+
//rewrote their solution from Python to Java:https://discuss.leetcode.com/topic/54986/python-memory-limit-exceeded-for-problem-386/17
21+
public List<Integer> lexicalOrder(int n) {
22+
List<Integer> result = new ArrayList();
23+
int i = 1;
24+
while (true) {
25+
result.add(i);
26+
if (i * 10 <= n) {
27+
i *= 10;
28+
} else {
29+
while (i % 10 == 9 || i == n) {
30+
i /= 10;
31+
}
32+
if (i == 0) {
33+
return result;
34+
}
35+
i++;
9536
}
96-
Collections.sort(result, new Comparator<Integer>() {
97-
@Override
98-
public int compare(Integer o1, Integer o2) {
99-
String s1 = String.valueOf(o1);
100-
String s2 = String.valueOf(o2);
101-
return s1.compareTo(s2);
102-
}
103-
});
104-
return result;
37+
}
10538
}
106-
39+
}
10740
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy