Эффективно находите первый повторяющийся символ в строке без использования дополнительной структуры данных за один проход - PullRequest
0 голосов
/ 07 августа 2020

Дана строка S. Задача - найти в ней первый повторяющийся символ. Нам нужно найти символ, который встречается более одного раза и у которого индекс второго вхождения наименьший. S содержит только строчные буквы.

Выдает неправильный вывод для input-'crg 'output-? ожидаемый -'- 1 '

Вот мой код-

private static Character first(String s)
    {
        String str ="";
        char c =(char)-1;
       // int flag=-1;
        char c1='\0';
       
        for(int i=0;i<s.length();i++)
        {
            char ch = s.charAt(i);
            if(str.indexOf(ch)==-1)
            str+=ch;
            else{
                c1=ch;
                break;
            }
        }
        
        if(s.equals(str))
        return c;
        else
        return c1;
    }

Ответы [ 3 ]

1 голос
/ 07 августа 2020

(char)-1 совпадает с \uffff, он всегда будет напечатан как ?, потому что \uffff не является допустимым символом Юникода.

0 голосов
/ 07 августа 2020

Попробуйте это.

private static int first(String s) {
    int[] codePoints = s.codePoints().toArray();
    int max = codePoints.length;
    for (int i = 0, p = 0, n = 0; i < max; p = n, ++i)
        if ((n = codePoints[i]) == p)
            return p;
    return -1;
}

и

System.out.println(Character.toString(first("絵文字も処理できる????")));

вывод

?
0 голосов
/ 07 августа 2020

Вместо попытки вернуть -1 или char, вы можете попытаться вернуть index из String или -1, поскольку -1 не является допустимым символом Unicode.

Вот лучший решение с использованием массива int для подсчета вхождений в строку, если будет найдено второе вхождение, оно вернет индекс или вернет -1.

  static int check(String str){
    int[] cnt= new int[26];
    for(int i = 0; i < str.length(); i++) {
      int v = str.charAt(i)-'a';
      cnt[v]++;
      if(cnt[v] > 1) {
        return i;
      }
    }
    return -1;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...