HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: java, string, программирование на java, разработка на java, строки, вывод, строка, анаграмма, сортировка строк</p>
1 <p>Теги: java, string, программирование на java, разработка на java, строки, вывод, строка, анаграмма, сортировка строк</p>
2 <p>При проведении собеседования на должность "<a>Разработчик Java</a>" технические специалисты любят задавать соискателям различные задачки. Одна из них - как определить, является ли одна строка перестановкой другой в<strong>Java</strong>. И как это сделать разными способами.</p>
2 <p>При проведении собеседования на должность "<a>Разработчик Java</a>" технические специалисты любят задавать соискателям различные задачки. Одна из них - как определить, является ли одна строка перестановкой другой в<strong>Java</strong>. И как это сделать разными способами.</p>
3 <p>Для начала уточним детали. Во-первых, следует учесть чувствительность к регистру. Например, является ли строка "dog" анаграммой "God". Также необходимо выяснить, учитываются ли пробелы.</p>
3 <p>Для начала уточним детали. Во-первых, следует учесть чувствительность к регистру. Например, является ли строка "dog" анаграммой "God". Также необходимо выяснить, учитываются ли пробелы.</p>
4 <p>Давайте предположим, что регистр и пробелы учитываются, а строки "dog" и " dog" не являются одинаковыми, так как они имеют разную длину. Как бы там ни было, эта задачка в Java совсем несложна и может быть решена несколькими способами.</p>
4 <p>Давайте предположим, что регистр и пробелы учитываются, а строки "dog" и " dog" не являются одинаковыми, так как они имеют разную длину. Как бы там ни было, эта задачка в Java совсем несложна и может быть решена несколькими способами.</p>
5 <h2>Метод 1. Сортировка строк</h2>
5 <h2>Метод 1. Сортировка строк</h2>
6 <p>Если строки в Java являются анаграммами, они включают в себя одинаковые символы, которые расположены в разном порядке. Для упорядочивания символов прекрасно подходит<strong>сортировка</strong>. После её выполнения консоль выведет 2 отсортированные версии строк.</p>
6 <p>Если строки в Java являются анаграммами, они включают в себя одинаковые символы, которые расположены в разном порядке. Для упорядочивания символов прекрасно подходит<strong>сортировка</strong>. После её выполнения консоль выведет 2 отсортированные версии строк.</p>
7 public String sort(String s) { char[] content = s.toCharArray(); java.util.Arrays.sort(content); return new String(content); } public boolean permutation (String s,String t) { if (s.length() != t.length()) { return false; } return sort(s).equals(sort(t)); }<p>Да, этот алгоритм сложно назвать оптимальным, но он удачен тем, что его легко понять. Кроме того, с практической точки зрения это довольно неплохой способ решить поставленную перед нами задачу на Java. Но если в приоритете эффективность, больше подходит другой алгоритм.</p>
7 public String sort(String s) { char[] content = s.toCharArray(); java.util.Arrays.sort(content); return new String(content); } public boolean permutation (String s,String t) { if (s.length() != t.length()) { return false; } return sort(s).equals(sort(t)); }<p>Да, этот алгоритм сложно назвать оптимальным, но он удачен тем, что его легко понять. Кроме того, с практической точки зрения это довольно неплохой способ решить поставленную перед нами задачу на Java. Но если в приоритете эффективность, больше подходит другой алгоритм.</p>
8 <h2>Метод 2. Проверяем счётчики идентичных символов</h2>
8 <h2>Метод 2. Проверяем счётчики идентичных символов</h2>
9 <p>Этот алгоритм работает за счёт использования такого свойства анаграммы, как одинаковые "счётчики" символов. Грубо говоря, мы лишь подсчитываем, сколько раз в нашей строке встречался каждый символ. А после того, как программа выведет результат, просто сравниваем массивы, которые получены для каждой строки.</p>
9 <p>Этот алгоритм работает за счёт использования такого свойства анаграммы, как одинаковые "счётчики" символов. Грубо говоря, мы лишь подсчитываем, сколько раз в нашей строке встречался каждый символ. А после того, как программа выведет результат, просто сравниваем массивы, которые получены для каждой строки.</p>
10 public boolean permutation(String s, String t) { if (s.length() != t.length()) { return false; } int[] letters = new int[256]; char[] s_array = s.toCharArray(); for (char c : s_array) { letters[c]++; } for (int i = 0; i &lt; t.length(); i++) { int c = (int) t.charAt(i); if (--letters[c] &lt; 0) { return false; } } return true; }<p>Обратите внимание, что здесь мы подразумеваем использование набора символов ASCII. Но этот способ можно модернизировать, что позволит нам работать не только через ASCII, но и за один проход цикла:</p>
10 public boolean permutation(String s, String t) { if (s.length() != t.length()) { return false; } int[] letters = new int[256]; char[] s_array = s.toCharArray(); for (char c : s_array) { letters[c]++; } for (int i = 0; i &lt; t.length(); i++) { int c = (int) t.charAt(i); if (--letters[c] &lt; 0) { return false; } } return true; }<p>Обратите внимание, что здесь мы подразумеваем использование набора символов ASCII. Но этот способ можно модернизировать, что позволит нам работать не только через ASCII, но и за один проход цикла:</p>
11 private static boolean permutations(String input, String second) { if( input.length() != second.length()){ return false; } Map&lt;Character,Integer&gt; map = new HashMap&lt;&gt;(); char[] inArray = input.toCharArray(); char[] secArray = second.toCharArray(); for( int i=0;i&lt;inArray.length;i++ ){ Integer val = map.computeIfAbsent(inArray[i], character -&gt; 0); val++; putRemoveMapValue(inArray[i],val,map); val = map.computeIfAbsent(secArray[i], character -&gt; 0); val--; putRemoveMapValue(secArray[i],val,map); } return map.size() == 0; } private static void putRemoveMapValue(char ch, int val, Map&lt;Character, Integer&gt; map){ if( val == 0 ){ map.remove(ch); } else { map.put(ch,val); } }<p>Что же, надеюсь, теперь эта задачка в Java не вызовет у вас затруднений. Но если вы хотите получить действительно продвинутые и систематизированные знания по Java-разработке, записывайтесь на наш<a>курс</a>!</p>
11 private static boolean permutations(String input, String second) { if( input.length() != second.length()){ return false; } Map&lt;Character,Integer&gt; map = new HashMap&lt;&gt;(); char[] inArray = input.toCharArray(); char[] secArray = second.toCharArray(); for( int i=0;i&lt;inArray.length;i++ ){ Integer val = map.computeIfAbsent(inArray[i], character -&gt; 0); val++; putRemoveMapValue(inArray[i],val,map); val = map.computeIfAbsent(secArray[i], character -&gt; 0); val--; putRemoveMapValue(secArray[i],val,map); } return map.size() == 0; } private static void putRemoveMapValue(char ch, int val, Map&lt;Character, Integer&gt; map){ if( val == 0 ){ map.remove(ch); } else { map.put(ch,val); } }<p>Что же, надеюсь, теперь эта задачка в Java не вызовет у вас затруднений. Но если вы хотите получить действительно продвинутые и систематизированные знания по Java-разработке, записывайтесь на наш<a>курс</a>!</p>
12  
12