我已经解决了hackerrank Java Map问题,但是我有2个案例的超时结果。当我更改了printf行时,问题就解决了。但是我不明白为什么会这样?这是我的代码:
import java.util.*;
import java.io.*;
class Solution{
private static HashMap<String, Integer> phoneBook = new HashMap<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String search = "";
int n=in.nextInt();
in.nextLine();
for(int i=0; i<n; i++) {
String name=in.nextLine();
int phone=in.nextInt();
phoneBook.put(name, phone);
in.nextLine();
}
while(in.hasNext()) {
search = in.nextLine();
if (phoneBook.get(search) != null)
System.out.printf(search + "=" + phoneBook.get(search) + "\n"); // this works
// System.out.printf("%s=%d\n", search, phoneBook.get(search)); // this does not work why ?
else
System.out.println("Not found");
}
}
答案 0 :(得分:2)
Formatter.format()
需要时间 Formatter.format()
(及其快捷键System.out.printf()
)需要解析,验证和格式化。所有这些都需要花费大量时间。
因此,请尽快转储数据。 Hackerrank要求您制作快速程序,因此只需:快速程序。连接项目而不是格式化它们。另外,如果您没有参数,则只需使用System.out.println()
而不是System.out.printf
。
答案 1 :(得分:2)
当执行格式化输出时,java解析要格式化的字符串(在您的情况下为"%s=%d\n"
)以放置值而不是占位符。至少需要O(n)
复杂度,这在您的情况下很重要。
您还两次致电phoneBook.get(search)
。尝试将结果保留在变量中。它还可以加快程序的速度。
答案 2 :(得分:0)
要将字符串分成几行,我们需要在printf语句中使用%n说明符。
System.out.printf("%s=%d%n", search, phoneBook.get(search));
或者您可以使用以下语句中显示的String.format()。
System.out.println(String.format("%s=%d",s,p));
答案 3 :(得分:0)
简短答案:Hashmap的查找性能+格式化从HashMap提取的值比只连接没有任何格式的字符串在计算上更加密集。
有点冗长,为get(Key)函数的O(1)摊销复杂度而设计的HashMap实现确实具有 O(n)(强调术语最坏的情况:)),如果所有或大多数键都共享一个公共哈希。当测试用例馈送器提供具有多个重复值的巨大测试用例输入时,虽然这种情况不太常见,但会发生。这种情况加上同步格式化会导致崩溃。