Решение рабочее, было проверено на нескольких примерах, но превышено ограничение времени по мнению системы проверки.
Хотя с онлайн компилятором результат получается очень быстро.
Подскажите как я могу оптимизировать это решение? Хотелось бы не прибегать к switch-case или массивам сопоставлений
package com.javarush.task.pro.task09.task0908;
import java.util.regex.Pattern;
import java.util.Map;
/*
Двоично-шестнадцатеричный конвертер
*/
public class Solution {
public static Map<String, String> BIN = Map.of("a", "1010", "b", "1011", "c",
"1100", "d", "1101", "e", "1110", "f", "1111");
public static String HEX = "0123456789abcdef";
public static void main(String[] args) {
String binaryNumber = "100111010000";
System.out.println("Двоичное число " + binaryNumber + " равно шестнадцатеричному числу " + toHex(binaryNumber));
String hexNumber = "9d0";
System.out.println("Шестнадцатеричное число " + hexNumber + " равно двоичному числу " + toBinary(hexNumber));
}
public static String toHex(String binaryNumber) {
if (binaryNumber == null || binaryNumber == "" || !Pattern.matches("[01]*", binaryNumber)) {
return "";
}
int len = binaryNumber.length();
while (len % 4 != 0) {
binaryNumber = "0" + binaryNumber;
}
String hex = "";
int digit = 0;
for (int i = len - 1, c = 1; i >= 0; i--, c++) {
digit += (int)(binaryNumber.charAt(i) - '0') * Math.pow(2, (len - i - 1) % 4);
if (c % 4 == 0) {
hex = HEX.charAt(digit) + hex;
digit = 0;
}
}
return hex;
}
public static String toBinary(String hexNumber) {
if (hexNumber == null || hexNumber == "" || !Pattern.matches("[0-9a-f]*", hexNumber)) {
return "";
}
String binary = "";
int len = hexNumber.length();
for (int i = len - 1; i >= 0; i--) {
char value = hexNumber.charAt(i);
int index = HEX.indexOf(value);
String digit = "";
for (int j = 0; index > 0; index /= 2, j++) {
digit = String.valueOf(index % 2) + digit;
}
while (digit.length() < 4) {
digit = "0" + digit;
}
binary = digit + binary;
}
return binary;
}
}