Я написал искатель анаграмм, который имеет двойное значение для l oop - как мне повысить эффективность этого кода? - PullRequest
0 голосов
/ 28 апреля 2020

В ответ на проблему Hackerank: https://www.hackerrank.com/challenges/ctci-making-anagrams/problem, где нужно найти число в виде целого числа символов, которые необходимо удалить из строки, чтобы сделать ее анаграммой другой строки.

Я выполнил код, и программа прошла тестирование, но мне нужна помощь в повышении его эффективности. Как мне go подумать, как повысить эффективность следующего кода?

    import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

public class Hackerank {

    // Complete the makeAnagram function below.
    static int makeAnagram(String a, String b) {
        int letterToRemoveCount = 0;
        Set<Character> characterMapA = new HashSet<>();
        Set<Character> characterMapB = new HashSet<>();

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

            if (!characterMapA.contains(a.charAt(i))) {
                characterMapA.add(a.charAt(i));
                if ((countOccurences(a.charAt(i), a) - countOccurences(a.charAt(i), b)) != 0) {
                    letterToRemoveCount += Math.abs((countOccurences(a.charAt(i), a) - countOccurences(a.charAt(i), b)));
                }
            }
        }
        for (int j = 0; j<b.length(); j++){
            if (!characterMapB.contains(b.charAt(j)) && !characterMapA.contains(b.charAt(j))) {
                characterMapB.add(b.charAt(j));
                if ((countOccurences(b.charAt(j), a) - countOccurences(b.charAt(j), b)) != 0) {
                    letterToRemoveCount += Math.abs((countOccurences(b.charAt(j), a) - countOccurences(b.charAt(j), b)));
                }
            }
        }
        return letterToRemoveCount;

    }

    public static int countOccurences(char m, String s){
        int count = 0;
        for(int i = 0; i< s.length(); i++){
            if(s.charAt(i) == m){
                count++;
            }
        }
        return count;
    }

    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) throws IOException {
        System.out.println(makeAnagram("fcrxzwscanmligyxyvym", "jxwtrhvujlmrpdoqbisbwhmgpmeoke"));
    }
}

1 Ответ

0 голосов
/ 29 апреля 2020

Первое правило оптимизации: избегайте ненужных операций:

  • Как звонить на contains перед вызовом add.

Второе правило оптимизации: если вы хотите быстрее, лучше использовать память:

  • Не вызывать одну и ту же функцию несколько раз с одними и теми же входными значениями : Лучше вызывать только один раз, сохранить значение в локальной переменной и использовать его впоследствии.
  • Кроме того, вычисление числа появлений символа в строке неэффективно (чем длиннее строки, тем менее эффективно ): Лучше создать карту для каждой строки, сопоставляя каждый символ с количеством вхождений.
  • Предложение Дейва о том, как оптимизировать такие карты, тоже интересно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...