实现稀疏数组

时间:2016-10-22 14:12:24

标签: java arrays java.util.scanner

问:有N个字符串。每个字符串的长度不超过20个字符。还有Q查询。对于每个查询,您将获得一个字符串,您需要找出此字符串之前发生的次数。

示例输入

[主要清单]

4

ABA

巴巴

ABA

xzxb

[查询]

3

ABA

xzxb

AB

示例输出

2 (aba出现两次出现在主列表中)

1 (xzxb在主列表中出现一次)

0 (ab未出现在主列表中)

我的代码

import java.util.*;

public class Solution {

public static void main(String[] args) {
Scanner scan = new Scanner(System.in);

int N = scan.nextInt(); // CONTAINS N number of String
String word[] = new String[N]; //Sets N as size of an array


for(int i = 0; i < N; i++){
    word[i] = scan.nextLine();//Stores a word in every index of an array

}

scan.nextLine(); //Flush index??(need help?!)



 int Q = scan.nextInt(); // Stores number of query
   String searchWord[] = new String[Q];//integer for size of query array
    for(int i = 0; i <Q; i++){
        searchWord[i] = scan.nextLine(); // stores query array for comparison
    }


   int counter = 0; // initializing counter

   for(int i=0; i <Q; i++){//Take a query word and check if it exists in word[] 
       for(int j =0; j <N; j++ ){//searches for the query word in main List
           if(word[j] == searchWord[i]){// if it exists counter value adds +1
               counter++;
           }
       }
       System.out.println(counter); //print counter
       counter = 0; // reset counter

   }
    }
}

首先,代码确实 NOT 工作,尽管逻辑似乎是正确的(我猜)。也有人可以解释为什么我们需要通过执行

来消耗换行

input.nextLine();

src:Scanner is skipping nextLine() after using next(), nextInt() or other nextFoo() methods

问题https://www.hackerrank.com/challenges/sparse-arrays

^^我如何在我的问题中使用它。谢谢! :)

3 个答案:

答案 0 :(得分:0)

在致电nextInt()后,需要使用nextLine()来使用该号码后面的任何字符...包括换行符。

(它与刷新索引无关。什么索引?)

所以...看起来你把它放在了错误的地方。

答案 1 :(得分:0)

工作代码:

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Enter number of main list:");
    try {
        short mainListCount = Short.valueOf(br.readLine());
        // if count is valid then reading main list
        if (mainListCount > 0) {
            List<String> mainList = new ArrayList<>();
            while (mainListCount > 0) {
                mainList.add(br.readLine());
                mainListCount--;
            }

            // getting query count
            System.out.println("\nEnter number of Query:");
            short queryCount = Short.valueOf(br.readLine());
            if (queryCount > 0) {
                String queryStr;
                String result = "";
                while (queryCount > 0) {
                    queryStr = br.readLine();
                    result += " Occurance of " + queryStr + ": " + Collections.frequency(mainList, queryStr) + "\n";
                    queryCount--;
                }
                System.out.println("\n" + result);
            }
            System.out.println("\n\n**program ends**");
        } else {
            System.out.println("Invalid count");
        }
    } catch (NumberFormatException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

关于扫描仪: 扫描程序使用分隔符模式将其输入分解为标记,分隔符模式默认匹配空格。 因此,当您执行scan.next()scan.nextInt()时,它会读取,直到遇到空格。例如,如果你键入4 4(中间的空格),它只需要4作为值,并且它不会读取行尾#34; \ n&#34;。 scan.nextLine()读到行尾。这就是为什么跳过scan.nextLine()之后scan.next()的原因,因为它会读取&#34; \ n&#34; (行尾)由于“输入”而已存在于控制台中。

答案 2 :(得分:0)

c#实现但可以很容易地翻译成java` &#39;

int totalInputs = Convert.ToInt16(Console.ReadLine());
            Dictionary<string, int> dict = new Dictionary<string, int>();
            for(i = 0; i< totalInputs;i++)
            {
                string input = Console.ReadLine();
                if(dict.ContainsKey(input))
                {
                    dict[input]++;
                }
                else
                {
                    dict.Add(input, 1);
                }
            }
            int queries = Convert.ToInt16(Console.ReadLine());
            string[] queryString = new string[queries];
            for(i=0;i<queries;i++)
            {
                queryString[i] = Console.ReadLine();
            }
            foreach(string str in queryString)
            {
                if(dict.ContainsKey(str))
                {
                    Console.WriteLine(dict[str]);
                }
                else
                {
                    Console.WriteLine(0);
                }
            }

`