2
public String countOfAtoms(String formula) {3
Deque<Integer> multiplier = new ArrayDeque<>();4
Map<String, Integer> map = new HashMap<>();9
// Iterate from right to left10
for (int i = formula.length() - 1; i >= 0; i--) {11
if (Character.isDigit(formula.charAt(i))) { // Case of a digit - Get full number and save12
StringBuilder sb = new StringBuilder();14
while (Character.isDigit(formula.charAt(i - 1))) {15
sb.append(formula.charAt(i));18
sb.append(formula.charAt(i));19
lastValue = Integer.parseInt(sb.reverse().toString());20
} else if (formula.charAt(i) == ')') { // Start parenthesis - push next multiplier to stack21
multiplier.push(lastValue * multiplier.peek());23
} else if (formula.charAt(i) == '(') { // End parenthesis - pop last multiplier25
} else { // Case of an element name - construct name, update count based on multiplier26
StringBuilder sb = new StringBuilder();28
while (Character.isLowerCase(formula.charAt(i))) {29
sb.append(formula.charAt(i));32
sb.append(formula.charAt(i));34
String element = sb.reverse().toString();35
map.put(element, map.getOrDefault(element, 0) + lastValue * multiplier.peek());41
List<String> elements = new ArrayList<>(map.keySet());42
StringBuilder sb = new StringBuilder();43
Collections.sort(elements);46
for (String element : elements) {48
if (map.get(element) > 1) {49
sb.append(map.get(element));