Java代码编译问题

时间:2016-09-20 19:00:57

标签: java

  1. 请检查错误
  2. 我已经显示发生了运行时错误
  3. 请告诉我这里出了什么问题。
  4. 这就是问题[黑客等级挑战 - 洗板]:https://www.hackerrank.com/contests/101hack41/challenges/washing-plates

  5. 错误:

     Exception in thread "main" java.util.NoSuchElementException
        at java.util.Scanner.throwFor(Scanner.java:862)
        at java.util.Scanner.next(Scanner.java:1485)
        at java.util.Scanner.nextInt(Scanner.java:2117)
        at java.util.Scanner.nextInt(Scanner.java:2076)
        at Plates.main(Plates.java:17)
    
  6. 代码。

    import java.util.*;
    
    public class Plates {
    
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            //System.out.println("Enter Details");
            String s = in.next();
            int l = s.length();
            int n = s.charAt(0);
            int k = s.charAt(l - 1);
            int arr[][] = new int[n][2];
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < 2; j++) {
                    arr[i][j] = in.nextInt();
                }
            }
            int max = 0;
            int inc[] = new int[n];
            int ded[] = new int[n];
            for(int t = 0; t < n; t++) {
                for(int p = 0; p < 2; p++) {
                    if(p == 0) {
                        inc[t] = arr[t][p];
                    } else if(p == 1) {
                        ded[t] = arr[t][p];
                    }
                }
            }
            int a, b;
            int sum = 0, loss = 0;
            for(a = 0; a < n; a++) {
                for(b = 1; b <= k; b++) {
                    sum = sum + inc[a + 1];
                    loss = loss - ded[a + 1];
                }
                if((sum - loss) > max) {
                    max = sum - loss;
                }
            }
            System.out.println(max);
        }
    }
    

2 个答案:

答案 0 :(得分:5)

HackerRank说:

  

第一行包含两个以空格分隔的整数,用于描述SELECT dt , WeekCommencing , [Week] , WeekofMonth , [DayofWeek] , [MonthName] , [year] , [Site] , Team , SubTeam , Client , Scheme , Calls_Offered , Calls_Answered FROM [LB ODS].WorkCalendarV2Emails WHERE (Site IN (@Site)) AND (Data_Label IN (@DataLabel)) AND (dt >= @startdate) AND (dt <= @enddate) ORDER BY dt (脏板数)和n的相应值(Harold有时间的板数)洗。)

     
      
  • 1&lt; = k&lt; = 20000,1&lt; = n&lt; = 20000
  •   

但是,您的代码正在做一些完全不同的事情:

k

由于next()只读取一个令牌,String s = in.next(); int l = s.length(); int n = s.charAt(0); int k = s.charAt(l - 1); 将是HackerRank值s的字符串值。

让我们说第一行是:

n

您的代码会将7000 20000 读为7000,然后分配sn = '7'

字符k = '0'具有ASCII / Unicode数值'7',字符55具有值'0'。所以你真正得到的是48n = 55

你应该做的,就是这样:

k = 48

<强>更新

比赛结束后,您可以阅读editorial page以查看解决方案。 Java没有multiset(有序列表),但您可以使用PriorityQueue

下面是一个替代解决方案,内存占用较低,适用于int n = in.nextInt(); int k = in.nextInt(); 的高值。

首先,假设您可以清洗所有板块,因此总结所有k值。如果p,您就完成了。现在,对于您无法清洗的每个印版,再次减去k >= n并减去p,例如从总数中减去d

然后目标是首先清洗具有最高p + d值的板,因此我们将从总数中减去较小的值。为此,请构建一个p + d值数组,对其进行排序,然后清洗/删除/跳过具有最高值的p + d版块。

最后,记住不要返回负值。

这里是紧凑的形式:

k

答案 1 :(得分:0)

最好使用out.size() == sizeof(int)函数读取完整行作为输入:

nextLine

然后根据空格分割字符串。