Попытка создать массив, чтобы найти вхождение символа в заданную строку. Разрешено использовать только методы length и charAt из класса String

#java #arrays

#java #массивы

Вопрос:

Попытка создать массив, чтобы найти вхождение символа в заданную строку.

 public static void main(String[] args)
{
  String s1 = "java";
  char ch = 'a';
 
System.out.println(indexOf(s1, ch));
}

public static int indexOf(String s, char ch)
{
  int count = 0;
  
  while (count < s.length())
  {
     if (s.charAt(count) == ch)
        return count;
        
     else
        count  = 1;
  }
  return -1;
}
  

Таким образом, результат должен быть 1 3

Комментарии:

1. Где должен быть массив? Потому что ваш код в порядке на данный момент

2. @azro int[] arr = indexOf(s1, ch); Что-то вроде этого в основном методе?

3. И что вы помещаете в этот массив? все индексы, в которых вы нашли значение?

4. Да, поэтому всякий раз, когда ch встречается в строке s1, индекс, в котором он встречается, будет скопирован и распечатан

5. Пожалуйста, отредактируйте свой пост и поделитесь примером ввода / вывода, который вы ожидаете

Ответ №1:

Из-за имеющихся у вас ограничений вам придется сначала создать массив с размером, равным длине строки (при условии, что все символы одинаковы). Затем выполните итерацию символов данной строки и сохраните индекс, в котором найдено совпадение с данным символом. Наконец, скопируйте инициализированные позиции этого массива в другой массив и верните то же самое. В случае, если совпадение не найдено, просто верните new int[] { -1 } .

ДЕМОНСТРАЦИЯ:

 import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        // Test
        String s1 = "java";
        char ch = 'a';

        int[] array = indexOf(s1, ch);
        System.out.println(Arrays.toString(array));

        array = indexOf(s1, 'x');
        System.out.println(Arrays.toString(array));
    }

    public static int[] indexOf(String s, char ch) {
        // The maximum size can be the length of the string i.e. when all chars are same
        int[] array = new int[s.length()];
        int count = 0;
        for (int i = 0; i < s.length(); i  ) {
            if (s.charAt(i) == ch) {
                array[count  ] = i;
            }
        }
        if (count == 0) {
            return new int[] { -1 };
        } else {
            // Create an array result[], of the size = count and copy elements from array[]
            // to it
            int[] result = new int[count];
            for (int i = 0; i < count; i  ) {
                result[i] = array[i];
            }
            return resu<
        }
    }
}
  

Вывод:

 [1, 3]
[-1]
  

Комментарии:

1. Извините, но забыл упомянуть, что метод — это int[], а не просто int . Предполагается, что выходные данные должны быть 1 и 3, поскольку ‘a’ встречается дважды в «java»

2. @DanielAdams — Я обновил ответ на основе этого разъяснения. Я добавил новую функцию count для этого нового требования. Не стесняйтесь комментировать в случае каких-либо дальнейших проблем / сомнений.

3. @DanielAdams — Я обновил ответ на основе этого дальнейшего разъяснения. Не стесняйтесь комментировать в случае каких-либо дальнейших проблем / сомнений.

Ответ №2:

Чтобы получить все индексы, в которых символ встречается в строке, вам нужно значение, которое отмечает позицию в строке, а другое — число совпадений, чтобы узнать позицию в результирующем массиве, и в конце вырезать массив, чтобы удалить ведущие неиспользуемые поля

 public static int[] indexOf(String s, char ch) {
    int count = 0;
    int[] result = new int[s.length()];
    for (int i = 0; i < result.length; i  ) {
        if (s.charAt(i) == ch) {
            result[count] = i;
            count  = 1;
        }
    }
    return Arrays.copyOf(result, count); // cut to keep indexes only
}
  

ДЕМОНСТРАЦИЯ

 System.out.println(Arrays.toString(indexOf("java", 'a')));        // [1, 3]
System.out.println(Arrays.toString(indexOf("abahauayata", 'a'))); // [0, 2, 4, 6, 8, 10]
System.out.println(Arrays.toString(indexOf("aaaaaaabbbb", 'a'))); // [0, 1, 2, 3, 4, 5, 6]
  

Комментарии:

1. @DanielAdams строка toString предназначена только для отображения результата ^^ Мне надоели запрещенные методы, извините, я больше не буду изменять. Из моего кода вы можете изменить несколько, чтобы удовлетворить ваши требования

Ответ №3:

 public static int[] indexOf(String s, char ch) {
    int total = 0;

    for (int i = 0; i < s.length(); i  )
        if (s.charAt(i) == ch)
            total  ;

    if (total == 0)
        return new int[0];

    int[] res = new int[total];

    for (int i = 0, j = 0; i < s.length(); i  )
        if (s.charAt(i) == ch)
            res[j  ] = i;

    return res;
}