Java中的Hackerearth问题中的NZEC错误

时间:2019-10-18 09:01:44

标签: java

我正在尝试解决此黑客问题{{​​3}}

我尝试通过互联网进行搜索,但是找不到解决我的问题的理想解决方案

这是我的代码:

String a = new String();
String b = new String();
a = sc.nextLine();
b = sc.nextLine();

int t = sc.nextInt();
int check = 0;
int againCheck =0;
for (int k =0; k<t; k++)
{
    for (int i =0; i<a.length(); i++)
    {
        char ch = a.charAt(i);       
        for (int j =0; j<b.length(); j++)
        {
            check =0;
            if (ch != b.charAt(j))
            {
                check=1;                      
            }

        }
        againCheck += check;           
    }
}

System.out.println(againCheck*againCheck);

我希望输出为4,但显示“ NZEC”错误

请问有人可以帮我吗?

3 个答案:

答案 0 :(得分:1)

需求状态为 1 ,即输入是数字(N),后跟2 x N行。您的代码正在读取两个字符串,后跟一个数字。尝试将输入的第三行解析为数字时,可能会抛出InputMismatchException

提示:


1-诚然,要求不是很明确。但是在示例输入中,第一行是数字。

答案 1 :(得分:0)

不管 hacker-whatsoever.com 如何,我都会给出两个有用的信息:

  • 一种更简单的算法,因此您可以自己编写代码,因为算法无法按预期工作;
  • 一种 Java 8+解决方案,它具有完全不同的算法,更加复杂,但效率更高。

SIMPLE ALGORITM

在您的解决方案中,您有一个典型的双for,可用于检查a中的每个字符是否也位于b中。那部分不错,但其余部分都是可废弃的。尝试实现这一点:

  • 对于a的每个字符,请在b中查找该字符的第一个匹配项
    • 如果有匹配项,请从ab中删除该字符。
  • 两个字符串中剩余字符的数量是您必须执行的删除操作,才能将它们转换为具有相同字符(即字谜)的字符串。因此,返回ab的长度之和。

注意:重要的是要跟踪已经遇到的情况:采用这种方法,您会多次计数相同的字符!

如您所见,它只是天真的算法的伪代码。只是给您一个提示,以帮助您学习。实际上,此算法的最大复杂度为 O(n ^ 2)(由于嵌套循环),通常这很不好。现在,一个更好的解决方案。

更好的解决方案

我的算法仅为 O(n)。它是这样工作的:

  • 我建立了一个map(如果您不知道这是什么,简单来说,这是一种存储夫妇“键值”的数据结构。)在这种情况下,键是字符,而值是整数计数器绑定到各自的角色。
  • 每次在a中发现一个字符时,其计数器都会增加1;
  • 每次在b中找到一个字符时,其计数器都会减少1;
  • 现在每个计数器代表其字符在ab中出现的次数之间的差异。因此,计数器的绝对值之和就是解决方案!

要实现它,实际上是在我第一次找到一个字符时添加一个要映射的条目,而不是用整个字母预先构建一个映射。我还用lambda表达式滥用了,所以给你一个非常不同的印象。

代码如下:

import java.util.HashMap;

public class HackerEarthProblemSolver {
    private static final String a =     //your input string
                                b =     //your input string
    static int sum = 0;                 //the result, must be static because lambda

    public static void main (String[] args){
        HashMap<Character,Integer> map = new HashMap<>();   //creating the map
        for (char c: a.toCharArray()){                      //for each character in a
            map.computeIfPresent(c, (k,i) -> i+1);          //+1 to its counter
            map.computeIfAbsent(c , k -> 1);                //initialize its counter to 1 (0+1)
        }
        for (char c: b.toCharArray()){                      //for each character in b
            map.computeIfPresent(c, (k,i) -> i-1);          //-1 to its counter
            map.computeIfAbsent(c , k -> -1);               //initialize its counter to -1 (0-1)
        }
        map.forEach((k,i) -> sum += Math.abs(i) );          //summing the absolute values of the counters
        System.out.println(sum) 
    }
}

基本上,两种解决方案都只计算两个字符串共有多少个字母,但是使用的方法不同。

希望我能帮上忙!

答案 2 :(得分:0)

正如我在其他答案中所写的那样,在网站上提交时最好像这样编写代码:

def myFunction():
    try:
        #MY LOGIC HERE
    except Exception as E:
        print("ERROR Occurred : {}".format(E))

这将清楚地显示您在每个测试用例中面临的错误。对于像hacker earth这样的网站,在各种测试用例中都有几个输入问题,这是必须的。

谈到您的问题,NZEC 代表:非零退出代码 这可能意味着从输入错误到服务器地震的任何事情。