Hackerrank Java Map问题超时问题

时间:2019-04-09 11:01:32

标签: java hashmap printf

我已经解决了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");  
    }
}

4 个答案:

答案 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)强调术语最坏的情况:)),如果所有或大多数键都共享一个公共哈希。当测试用例馈送器提供具有多个重复值的巨大测试用例输入时,虽然这种情况不太常见,但会发生。这种情况加上同步格式化会导致崩溃。