Решаю задачку. В общем, начальную строку нужно преобразовать в новую, заменив все повторяющиеся символы на правую скобочку ')', а все уникальные - на левую '('.
Мое решение:
public class DuplicateEncoder {
static String encode(String word) {
String newWord = "";
char[] chArray = word.toCharArray();
for (int i = 0; i < word.length(); i++) {
if (word.chars().filter(num -> num == chArray[i]).count() > 1)
{ newWord = newWord + "("; }
else
{ newWord = newWord + ")"; }
}
return newWord;
}
}
В нем такая ошибка:
/workspace/java/src/DuplicateEncoder.java:6: error: local variables referenced from a lambda expression must be final or effectively final
if (word.chars().filter(num -> num == chArray[i]).count() > 1)
^
1 error
Как исправить эту ошибку?
Захваченное лямбда-выражением локальное значение должно быть effectively final. Этого можно добиться, например, с помощью создания final
-переменной:
final ch = chArray[i];
if (word.chars().filter(num -> num == ch).count() > 1)
А вообще можно переписать решение, чтобы оно работало не за O(n^2)
, а за O(n)
(n
- длина слово).
Для этого достаточно проходить по слову два раза: первый раз для подсчета количества вхождений символов и сохранения результатов в Map
, а второй - для сбора итоговой строки по данным из Map
.
Также для сбора строки лучше использовать StringBuilder
, а не конкатенацию строк.
Итоговый код:
static String encode(String word)
{
HashMap<Character, Integer> charToCount = new HashMap<>();
char[] chars = word.toLowerCase().toCharArray();
for (char ch : chars)
{
int currentCount = charToCount.containsKey(ch) ? charToCount.get(ch) : 0;
charToCount.put(ch, currentCount + 1);
}
StringBuilder sb = new StringBuilder(word.length());
for (char ch : chars)
{
char replaceChar = charToCount.get(ch) == 1 ? '(' : ')';
sb.append(replaceChar);
}
return sb.toString();
}
P.S. Зашел на сайт задания - нужно ещё игнорировать регистр букв, добавил это в код
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Нужно сделать закругленные края в счётчике Navigation Drawer, на картинке, без использования библиотеки
Пытаюсь передать int значение из одного класса в другой, но значение не передается и присваивается default значение
Приведу пример своей реализацииЧать класс Utils:
Есть консоль, которая реализована с помощью TextFlow, там цветные сообщения (если ошибка - красное, предупреждение - желтое и тд)TextFlow не дает выделять...