Проверить, если две строки являются перестановками друг друга


Описание:

Даны две строки, проверьте, если эти двое перестановку друг друга. Ожидается, что входная строка может содержать символы ASCII.

Код:

class Main {
  public static boolean isPermutation(String s1, String s2) {
    if (s1 == null || s2 == null) {
      throw new IllegalArgumentException("Input string cannot be null");
    }
    if (s1.length() != s2.length()) {
      return false;
    }
    int[] count = new int[256];
    for (int i = 0; i < s1.length(); i++) {
      int index = s1.charAt(i) - '0';
      count[index] += 1;
    }
    for (int i = 0; i < s2.length(); i++) {
      int index = s2.charAt(i) - '0';
      count[index] -= 1;
    }
    for (int i = 0; i < count.length; i++) {
      if (count[i] != 0) return false;
    }
    return true;  
  }

  public static void main(String[] args) {
    //System.out.println(isPermutation(null, null) == true);
    System.out.println(isPermutation("", "") == true);
    System.out.println(isPermutation("a", "") == false);
    System.out.println(isPermutation("", "b") == false);
    System.out.println(isPermutation("a", "a") == true);
    System.out.println(isPermutation("a", "b") == false);
    System.out.println(isPermutation("foo", "bar") == false);
    System.out.println(isPermutation("eat", "ate") == true);
    System.out.println(isPermutation("1010", "1100") == true);
  }
}

Вопросы:

  1. Из интервью точки зрения тестов достаточно?

  2. я правильно используя функции Java?

  3. Я думаю, что я могу объединить две для петли, но я сделал над кодированием во времени ограниченной мода, он может поднять красный флаг от интервьюера точки зрения?

ЗЫ: по мне, я могу использовать карту, если входная строка может содержать символы юникода.



Комментарии
1 ответ

Тестовые случаи

С точки зрения интервью, я хотел бы предложить, что вы пропустили тест для нулевой обработки. Создание полного модульные тесты в интервью-это перебор, но это слишком много, чтобы просто добавить:

try {
System.out.println("Should not happen: " + isPermutation(null, ""));
} catch (IllegalArgumentException e) {
System.out.println("Got expected exception for null");
}

Функции Java

Использование функции Java-это хорошо, но ты не делаешь всего много.

Ошибки

Ваш спец говорит, что строки будут содержать символы ASCII, и для меня такие вещи, как пробелы и знаки препинания -_!@#$%.... все символы ASCII. Код вычитает 0 символьное значение из строки символов, чтобы получить массив индексов. Это не пробелы и знаки препинания. Почему нужно делать 0 вычитание вообще? Код будет работать для всех ASCII без этого в любом случае.

Алгоритм

Моя самая большая предложение все равно об алгоритме,. Ваш код считает все символы и сравнивает отсчеты. Гораздо проще и интуитивно понятный алгоритм для сортировки символов и сравнить результаты.....

Рассмотрим:

private static String normalize(String value) {
char[] chars = value.toCharArray();
Arrays.sort(chars);
return new String(chars);
}

public static boolean isPermutation(String s1, String s2) {
if (s1 == null || s2 == null) {
throw new IllegalArgumentException("Input string cannot be null");
}
return normalize(s1).equals(normalize(s2));
}

4
ответ дан 27 марта 2018 в 09:03 Источник Поделиться