Я пробовал, как в приведенном ниже коде, но это работает только в том случае, если есть только один набор символов и набор символов появляются в середине строки. Если набор появляется более одного раза и появляется в конце или в начале строки, результат будет ложным.

    String str = "aaabbccdddefghjjkklmn";

for(int i = 1; i < str.length() - 1; i++){
    if (str.charAt(i) != str.charAt(i+1) && str.charAt(i) != str.charAt(i-1)){
        System.out.print(str.charAt(i));
    }
}

С приведенной выше строкой результат должен быть только "efgh", но код выше отображает "efghlm"

0
Huy Nguyen 31 Май 2019 в 06:43

2 ответа

Лучший ответ

Проблема, заставляющая вас пропустить начальные и конечные значения, заключается в том, как вы построили цикл for.

Так должно быть:

for (int i = 0; i < str.length(); i++)

Поэтому вам нужно по-разному обрабатывать крайние случаи.

if ( (i+1 >= str.length() || str.charAt(i) != str.charAt(i+1)) && (i-1 < 0 || str.charAt(i) != str.charAt(i-1)) )

Таким образом, вы включаете первый и последний индексы без доступа вне диапазона. Кроме того, если вы хотите убедиться, что вы получаете только первый экземпляр символов, вам нужно немного кода, чтобы выйти из цикла. Присвойте логическое значение true, когда проверка вернет true. Если проверка возвращает false, проверьте, является ли найденный вами логический параметр true. Если это так, вырваться из цикла.

boolean foundMatch = false;
for (int i = 0; i < str.length(); i++) {
    if ( (i+1 >= str.length() || str.charAt(i) != str.charAt(i+1)) && (i-1 < 0 || str.charAt(i) != str.charAt(i-1)) ) {
        System.out.print(str.charAt(i));
        foundMatch = true;
    }
    else {
        if (foundMatch == true) break;
    }
}
0
Jeremy Owens 31 Май 2019 в 04:00

Ваш метод правильный. То, что вам нужно разорвать цикл после того, как найден повторяющийся символ, ПОСЛЕ того, как вы нашли первый набор неповторяющихся символов.

Ниже приведен фрагмент кода, эквивалентный JavaScript

 var str = "aaabbccdddefghjjkklmn";

var result = "";
for(var i = 1; i < str.length - 1; i++){
    // Find for non-repeating character
    if (str.charAt(i) != str.charAt(i+1) && str.charAt(i) != str.charAt(i-1)){
        result += str.charAt(i)
    }
    else {
      // Repeating character found
      // exit loop if non-repeating character already
      // found
      if (result.length > 0) {
        break;
      }
    }
}

console.log(result);
0
jimmy5312 31 Май 2019 в 04:00