问:有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
^^我如何在我的问题中使用它。谢谢! :)
答案 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);
}
}
`