java - 我编写了一个带有双 for 循环的 anagrams finder - 如何提高此代码的效率?
问题描述
针对 Hackerrank 问题:https ://www.hackerrank.com/challenges/ctci-making-anagrams/problem必须找到要从字符串中删除的字符数(作为整数)以使其成为字谜另一个字符串。
我已经完成了代码并且程序通过了测试,但我需要帮助来提高它的效率。我该如何思考如何提高以下代码的效率?
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"));
}
}
解决方案
优化的第一条规则:避免不必要的操作:
- 就像打电话
contains
之前打电话一样add
。
优化的第二条规则:如果你想要它更快,你最好依靠内存:
- 不要使用相同的输入值多次调用相同的函数:最好只调用一次,将值存储在局部变量中,然后再使用它。
- 此外,计算字符串中某个字符的出现次数效率不高(字符串越长,效率最低):最好为每个字符串创建一个映射,将每个字符映射到出现次数。
- Dave 关于如何优化此类地图的建议也很有趣。
推荐阅读
- sql - 如何在社交网络分析 (SNA) 中使用 SQL 获取两列之间的平均值以压缩行
- javascript - 带有 javascript 的验证表单,失败活动错误类
- swift - 如何在 Swift 中获取常量值类型的内存地址?
- ruby-on-rails - 如果记录太多,如何获取活动记录以引发异常
- visual-studio-extensions - 在 VISX 上使用来自私有源的 nuget 包
- javascript - 从文本区域执行 jquery
- python - 踢命令给出错误
- python - 模拟将函数参数分配给 *args 和 **kwargs
- c++ - 常量表达式中的非文字类型“比较”
- ssl - 无法通过其通用名称访问服务器