Skip to content

Commit 4030185

Browse files
update roman to int and int --> roman
1 parent 90ccae9 commit 4030185

File tree

4 files changed

+81
-91
lines changed

4 files changed

+81
-91
lines changed

src/HelloWorld.java

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
1-
import java.util.Arrays;
2-
31
public class HelloWorld {
4-
public int canCompleteCircuit(int[] gas, int[] cost) {
5-
final int totalGas = Arrays.stream(gas).sum();
6-
final int totalCost = Arrays.stream(cost).sum();
2+
public int lengthOfLastWord(String s) {
3+
int i = s.length() - 1;
74

8-
if (totalCost > totalGas) {
9-
return -1;
5+
// skip all spaces at the end of the word
6+
while (i >= 0 && s.charAt(i) == ' ') {
7+
i--;
108
}
119

12-
int startingIndex = 0;
13-
for (int i = 0, currentGas = 0 ; i < cost.length ; i++) {
14-
currentGas += gas[i] - cost[i];
15-
if (currentGas < 0) {
16-
currentGas = 0;
17-
startingIndex = i + 1;
18-
}
10+
final int wordEndIndex = i;
11+
12+
// arrive at the start of the word
13+
while (i >= 0 && s.charAt(i) != ' ') {
14+
i--;
1915
}
20-
return startingIndex;
16+
17+
return wordEndIndex - i;
2118
}
22-
}
19+
}

src/IntegerToRoman.java

Lines changed: 20 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,61 +2,35 @@
22
// T: O(log n)
33
// S: O(log n)
44

5-
import java.util.Map;
6-
75
public class IntegerToRoman {
8-
private final static int ONE = 1;
9-
private final static int FIVE = 5;
10-
private final static int TEN = 10;
11-
12-
private final static Map<Integer, String> ONES_PLACE_ROMAN_CHARS = Map.ofEntries(
13-
Map.entry(ONE, "I"),
14-
Map.entry(FIVE, "V"),
15-
Map.entry(TEN, "X")
16-
);
17-
18-
private final static Map<Integer, String> TENS_PLACE_ROMAN_CHARS = Map.ofEntries(
19-
Map.entry(ONE, "X"),
20-
Map.entry(FIVE, "L"),
21-
Map.entry(TEN, "C")
22-
);
23-
24-
private final static Map<Integer, String> HUNDREDS_PLACE_ROMAN_CHARS = Map.ofEntries(
25-
Map.entry(ONE, "C"),
26-
Map.entry(FIVE, "D"),
27-
Map.entry(TEN, "M")
28-
);
6+
private static final String[] ROMAN_VALUES = new String[] { "I", "V", "X", "L", "C", "D", "M" };
297

308
public String intToRoman(int num) {
31-
final StringBuilder result = new StringBuilder();
32-
for (int place = 1000 ; num > 0 ; place /= 10) {
33-
result.append(toRoman(num / place, place));
34-
num -= (num / place) * place;
9+
final StringBuilder builder = new StringBuilder();
10+
final String number = num + "";
11+
for (int i = 0 ; i < number.length() ; i++) {
12+
builder.append(getRomanString(number.charAt(i), number.length() - i - 1));
3513
}
36-
return result.toString();
14+
return builder.toString();
3715
}
3816

39-
private String toRoman(int digit, int place) {
40-
return switch (place) {
41-
case 1 -> toRomanFromPlace(digit, ONES_PLACE_ROMAN_CHARS);
42-
case 10 -> toRomanFromPlace(digit, TENS_PLACE_ROMAN_CHARS);
43-
case 100 -> toRomanFromPlace(digit, HUNDREDS_PLACE_ROMAN_CHARS);
44-
case 1000 -> thousandsPlaceToRoman(digit);
45-
default -> "";
46-
};
47-
}
17+
private static String getRomanString(char digit, int power) {
18+
if (digit == '4') {
19+
return ROMAN_VALUES[2 * power] + ROMAN_VALUES[2 * power + 1];
20+
}
21+
if (digit == '9') {
22+
return ROMAN_VALUES[2 * power] + ROMAN_VALUES[2 * power + 2];
23+
}
4824

49-
private String toRomanFromPlace(int digit, Map<Integer, String> romanChars) {
5025
return switch (digit) {
51-
case 1, 2, 3 -> romanChars.get(ONE).repeat(digit);
52-
case 4 -> romanChars.get(ONE) + romanChars.get(FIVE);
53-
case 5, 6, 7, 8 -> romanChars.get(FIVE) + romanChars.get(ONE).repeat(digit - 1);
54-
case 9 -> romanChars.get(ONE) + romanChars.get(TEN);
26+
case '1' -> ROMAN_VALUES[2 * power].repeat(1);
27+
case '2' -> ROMAN_VALUES[2 * power].repeat(2);
28+
case '3' -> ROMAN_VALUES[2 * power].repeat(3);
29+
case '5' -> ROMAN_VALUES[2 * power + 1];
30+
case '6' -> ROMAN_VALUES[2 * power + 1] + ROMAN_VALUES[2 * power].repeat(1);
31+
case '7' -> ROMAN_VALUES[2 * power + 1] + ROMAN_VALUES[2 * power].repeat(2);
32+
case '8' -> ROMAN_VALUES[2 * power + 1] + ROMAN_VALUES[2 * power].repeat(3);
5533
default -> "";
5634
};
5735
}
58-
59-
private String thousandsPlaceToRoman(int digit) {
60-
return "M".repeat(digit);
61-
}
6236
}

src/LengthOfLastWord.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,23 @@
1+
// https://leetcode.com/problems/length-of-last-word
2+
// T: O(N)
3+
// S: O(1)
4+
15
public class LengthOfLastWord {
2-
public int lengthOfLastWord(String sentence) {
3-
String[] words = sentence.split(" ");
4-
if (words.length == 0) {
5-
return 0;
6+
public int lengthOfLastWord(String s) {
7+
int i = s.length() - 1;
8+
9+
// skip all spaces at the end of the word
10+
while (i >= 0 && s.charAt(i) == ' ') {
11+
i--;
12+
}
13+
14+
final int wordEndIndex = i;
15+
16+
// arrive at the start of the word
17+
while (i >= 0 && s.charAt(i) != ' ') {
18+
i--;
619
}
720

8-
return words[words.length - 1].length();
21+
return wordEndIndex - i;
922
}
1023
}

src/RomanToInteger.java

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,41 @@
1-
// https://leetcode.com/problems/roman-to-integer/
1+
// https://leetcode.com/problems/roman-to-integer
2+
// T: O(|S|)
3+
// S: O(1)
24

3-
import java.util.HashMap;
45
import java.util.Map;
5-
import java.util.Scanner;
6+
import java.util.Set;
67

78
public class RomanToInteger {
8-
private static final Map<Character, Integer> romanNumerals = new HashMap<>();
9+
private static final Map<Character, Integer> ROMAN_NUMERALS = Map.of(
10+
'I', 1,
11+
'V', 5,
12+
'X', 10,
13+
'L', 50,
14+
'C', 100,
15+
'D', 500,
16+
'M', 1000
17+
);
918

10-
static {
11-
romanNumerals.put('I', 1);
12-
romanNumerals.put('V', 5);
13-
romanNumerals.put('X', 10);
14-
romanNumerals.put('L', 50);
15-
romanNumerals.put('C', 100);
16-
romanNumerals.put('D', 500);
17-
romanNumerals.put('M', 1000);
18-
}
19+
private static final Map<Character, Set<Character>> DECREMENT_ROMAN_NUMERALS = Map.of(
20+
'I', Set.of('V', 'X'),
21+
'X', Set.of('L', 'C'),
22+
'C', Set.of('D', 'M')
23+
);
1924

20-
private static int romanToInt(String string) {
21-
int value = 0;
22-
for (int index = 0 ; index < string.length() ; index++) {
23-
if (index < string.length() - 1 && value(string.charAt(index)) < value(string.charAt(index + 1))) {
24-
value -= value(string.charAt(index));
25+
public int romanToInt(String s) {
26+
int number = 0;
27+
for (int i = 0 ; i < s.length() ; ) {
28+
final char c = s.charAt(i);
29+
if (DECREMENT_ROMAN_NUMERALS.containsKey(c)
30+
&& i + 1 < s.length()
31+
&& DECREMENT_ROMAN_NUMERALS.get(c).contains(s.charAt(i + 1))) {
32+
number += ROMAN_NUMERALS.get(s.charAt(i + 1)) - ROMAN_NUMERALS.get(c);
33+
i += 2;
2534
} else {
26-
value += value(string.charAt(index));
35+
number += ROMAN_NUMERALS.get(c);
36+
i++;
2737
}
2838
}
29-
return value;
30-
}
31-
32-
private static int value(char character) {
33-
return romanNumerals.get(character);
39+
return number;
3440
}
3541
}

0 commit comments

Comments
 (0)