chore(Java) : add roman numerals conversion (#849)

* Add Roman Numerals Conversion

* roman numerals conversion, expanded description

* roman numerals conversion, expanded description
pull/865/head
Vivi Koutsoumanidou 2022-10-01 00:11:58 +03:00 committed by GitHub
parent b4cd97f55a
commit 62907b69ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 155 additions and 0 deletions

View File

@ -0,0 +1,154 @@
import java.util.HashMap;
/**
* Problem: To convert an integer to its Roman numeral equivalent and vice versa.
* ----------------------------------------------------------------------------------------------------------------
*
* Time Complexity: O(n)
* Space Complexity: O(1)
*
* ----------------------------------------------------------------------------------------------------------------
*
* Constraints:
* The input sting should contain only the characters ('I', 'V', 'X', 'L', 'C', 'D', 'M').
* It is guaranteed that the input is a valid roman numeral in the range [1, 3999].
*
* ----------------------------------------------------------------------------------------------------------------
*
* Description:
* There are seven basic different symbols to represent roman numerals: I, V, X, L, C, D and M.
* Those being:
* Symbol Value
* I 1
* V 5
* X 10
* L 50
* C 100
* D 500
* M 1000
*
* Roman numerals are usually written from largest to smallest, from left to right.
* There are six instances where this rule does not apply and subtraction is used instead:
* I can be placed before V (5) and X (10) to make 4 (IV) and 9 (IX). (5 - 1 and 10 - 1, respectively)
* X can be placed before L (50) and C (100) to make 40 (XL) and 90 (XC). (50 - 10 and 100 - 10, respectively)
* C can be placed before D (500) and M (1000) to make 400 (CD) and 900 (CM). (500 - 100 and 1000 - 100, respectively)
*
* ----------------------------------------------------------------------------------------------------------------
*
* Examples:
* 1) Input: s = "II"
* Output: 2
* Explanation: 2 = 1 + 1 = I + I.
*
* 2) Input: s = 31
* Output: "XXXI"
* Explanation: 31 = 30 + 1 = XXX + I.
*
* 3) Input: s = "CMXLI"
* Output: 941
* Explanation: 941 = 900 + 40 + 1 = CM + XL + I.
*
**/
public class RomanNumeralConverter {
/**
* This method converts a roman numeral to its integer equivalent.
* @param s The input roman numeral to be converted.
* @return The integer equivalent of the roman numeral.
*/
public int romanToInt(String s){
int result = 0;
int prev = 0;
// for each character in the given string
for (int i = s.length() - 1; i >= 0; i--) {
// get the integer value of the character
int current = switch (s.charAt(i)) {
case 'I' -> 1;
case 'V' -> 5;
case 'X' -> 10;
case 'L' -> 50;
case 'C' -> 100;
case 'D' -> 500;
case 'M' -> 1000;
default -> throw new IllegalArgumentException("Invalid roman number");
};
// check if the right number is greater than the left number (previous character) in the given string (case of subtraction)
if (current < prev) {
result -= current; // subtract the right number from the result
} else {
result += current;
}
prev = current; // update the previous number
}
return result;
}
/**
* This method converts an integer to its roman numeral equivalent.
* @param num The input integer to be converted.
* @return The roman numeral equivalent of the integer.
*/
public String intToRoman(int num) {
// Create a hashmap to store the 7 basic roman numerals and the six special cases of subtraction
HashMap<Integer, String> map = new HashMap<>();
map.put(1,"I");
map.put(4,"IV");
map.put(5,"V");
map.put(9,"IX");
map.put(10,"X");
map.put(40,"XL");
map.put(50,"L");
map.put(90,"XC");
map.put(100,"C");
map.put(400,"CD");
map.put(500,"D");
map.put(900,"CM");
map.put(1000,"M");
int[] arr = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; // store the keys of the hashmap in an array
int len = arr.length;
StringBuilder result = new StringBuilder();
while(num > 0){
int i;
// find the largest number in the array that is less than or equal to the given number
for(i = 0; i < len; i++) {
if (arr[i] <= num) break;
}
result.append(map.get(arr[i])); // append the equivalent roman numeral to the result
num = num - arr[i]; // subtract the found key from the given number
}
return result.toString();
}
public static void main(String[] args) {
RomanNumeralConverter converter = new RomanNumeralConverter();
// Roman to Integer
System.out.println("Roman to Integer Conversion Examples:");
System.out.println("DCXXI = " + converter.romanToInt("DCXXI"));
System.out.println("II = " + converter.romanToInt("II"));
System.out.println("CCXCIV = " + converter.romanToInt("CCXCIV"));
System.out.println("IX = " + converter.romanToInt("IX"));
System.out.println("XXXI = " + converter.romanToInt("XXXI"));
System.out.println("CMXLI = " + converter.romanToInt("CMXLI"));
System.out.println("MCCXXVI = " + converter.romanToInt("MCCXXVI"));
System.out.println("CXLVIII = " + converter.romanToInt("CXLVIII"));
System.out.println("<------------------------------------------------------------------->");
// Integer to Roman
System.out.println("Integer to Roman Conversion Examples:");
System.out.println(621 + " = " + converter.intToRoman(621));
System.out.println(2 + " = " + converter.intToRoman(2));
System.out.println(294 + " = " + converter.intToRoman(294));
System.out.println(9 + " = " + converter.intToRoman(9));
System.out.println(31 + " = " + converter.intToRoman(31));
System.out.println(941 + " = " + converter.intToRoman(941));
System.out.println(1226 + " = " + converter.intToRoman(1226));
System.out.println(148 + " = " + converter.intToRoman(148));
}
}

View File

@ -34,6 +34,7 @@
- [Nth Geek Onacci Number](Maths/nth-geek-onacci-number.java)
- [Random Node in Linked List](Maths/algorithms_random_node.java)
- [Square Root using BinarySearch](Maths/square-root.java)
- [Roman Numerals Conversion](Maths/roman-numerals.java)
## Queues