【问题标题】:The Hash Table does not gives the desired output哈希表没有给出所需的输出
【发布时间】:2018-10-19 05:37:23
【问题描述】:

我尝试用一​​个字符串数组的内容填充哈希表,然后匹配第二个数组的内容,如果它全部包含在第一个数组中。

例如

今天晚上给我一个盛大的 - String A

今天给一个盛大的 - 字符串 B

我的程序应该输出 Yes,因为字符串 B 的所有内容都包含在 A 中。

详细问题在这里:-https://www.hackerrank.com/challenges/ctci-ransom-note/problem

这是我的 Java 代码:-

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

public class Solution {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int m = in.nextInt();
        int n = in.nextInt();
        String magazine[] = new String[m];
        for(int magazine_i=0; magazine_i < m; magazine_i++){
            magazine[magazine_i] = in.next();
        }
        String ransom[] = new String[n];
        for(int ransom_i=0; ransom_i < n; ransom_i++){
            ransom[ransom_i] = in.next();
        }

        Hashtable<Integer,String> hm = new Hashtable<Integer,String>();
        for(int magazine_i=0; magazine_i < m; magazine_i++){
            hm.put(1,magazine[magazine_i]);
            //System.out.println(magazine[magazine_i]);
        }

        boolean isavailable = false;

        for(int ransom_i=0; ransom_i < n; ransom_i++){
            isavailable = hm.containsValue(ransom[ransom_i]);
            //System.out.println(ransom[ransom_i]+" "+isavailable);
            if(isavailable==flase)
            {System.out.println("No"); break;}
        }

        if(isavailable==true)
            System.out.println("Yes");

    }
 }

相反,它给出了 False,我认为的问题是哈希表无法匹配数组的内容及其值。

【问题讨论】:

  • 对不起,先生!我尝试反转它,它仍然给出错误的答案。我最初是按照你所说的方式写的。感谢您的通知,我已在问题中更正了这一点。
  • 在下面查看我的答案

标签: java data-structures hash hashtable


【解决方案1】:

您的 Hashtable 仅包含单个键值对,因为您初始化它的方式:

   hm.put(1,magazine[magazine_i]);

先尝试改正

顺便说一句,你的方法是错误的。

要生成ransom,必须确保ransom 中的所有单词都包含在magazine 中,并且magazine 中该单词的计数应大于或等于对应的计数ransom中的那个词。

也就是说,如果ransom 包含 4 个单词 'today',那么在 magazine 中,您必须确保至少有 4 个单词 'today'。

因此,您应该这样处理问题:

  1. magazine,为magazineHashMap&lt;String, Integer&gt; magazineWordCount构建字数统计图。

  2. ransom,为ransom构建字数图:HashMap&lt;String, Integer&gt; ransomWordCount

  3. 循环遍历ransom 键(通过ransomWordCount.keySet()),检查

     magazineWordCount.contains(word) && magazineWordCount.get(word) >= ransomWordCount.get(word)
    

【讨论】:

  • 先生,我更正了,为所有元素添加了唯一键。仍然对输出没有帮助。
  • 如果需要,您可以将HashMap 替换为HashTable
  • 这似乎是答案,感谢您的宝贵反馈。
【解决方案2】:

你可以通过这样做来简化你的代码

  • 摆脱输入大小的提示
  • 快速失败

    Scanner in = new Scanner(System.in);
    System.out.println("Enter sentence 1");
    String s1 = in.nextLine();
    System.out.println("Enter sentence 2");
    String s2 = in.nextLine();
    
    List<String> s1List = Arrays.asList(s1.split(" "));
    for (String w : s2.split(" ")) {
        System.out.println("loooking for " + w);
        if (s1List.contains(w) == false) {
            System.out.println("Failed to find");
            return;
        }
    }
    System.out.println("yes");
    

编辑

如果你想使用哈希表,那么你可以像这样填写它

    String [] arr = s1.split(" ");
    Hashtable <Integer, String> s1ht = new Hashtable<Integer, String>();
    for (int i = 0; i < arr.length; i++) {
        s1ht.put(i, arr[i]);
    }

所有其他代码都相同(只需更改变量名)

【讨论】:

  • 谢谢你,可怕的袋熊!我想改用哈希表来做到这一点。
猜你喜欢
  • 2015-07-05
  • 2016-11-26
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 2016-09-07
  • 2018-06-19
相关资源
最近更新 更多