【问题标题】:Java Code Compile IssueJava 代码编译问题
【发布时间】:2017-01-28 20:07:12
【问题描述】:
  1. 请检查错误
  2. 我已显示发生的运行时错误
  3. 请说明其中出了什么问题。
  4. 这就是问题 [Hacker Rank Challenges - Washing Plates ]: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);
        }
    }
    

【问题讨论】:

  • 正在编译。它在运行时失败。
  • 不确定发生了什么,但我认为您的堆栈跟踪明确说明了您在这一行中的错误arr[i][j] = in.nextInt();
  • 最好在源代码中指出,即异常中提到的行。
  • 下一步是查看库方法的 Javadocs,它会抛出异常(在本例中为 java.util.Scanner.nextInt),以了解它抛出异常的原因。然后,如果您不理解它(尽管在这种情况下,文档中似乎已经足够清楚......),您可能会问那个,它是什么意味着当@ 987654326@ 抛出NoSuchElementException
  • 您应该在尝试执行in.nextInt() 之前检查集合中是否还有其他元素(通常您会使用while(in.hasNextInt()) 作为迭代器而不是for loop)。 java.util.NoSuchElementException 在运行时抛出,这就是你的代码编译的原因。

标签: java


【解决方案1】:

HackerRank 说:

第一行包含两个以空格分隔的整数,分别描述了n(脏盘子的数量)和k(Harold 有时间清洗的盘子数量)的值。

  • 1 n k

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

String s = in.next();
int l = s.length();
int n = s.charAt(0);
int k = s.charAt(l - 1);

由于next() 只读取一个令牌,s 将是 HackerRank 值n 的字符串值。

假设第一行是:

7000 20000

您的代码会将7000 读入s,然后分配n = '7'k = '0'

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

你应该做的就是这样:

int n = in.nextInt();
int k = in.nextInt();

更新

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

下面是一个替代解决方案,对于 k 的高值,内存占用更少。

首先,假设您可以清洗所有盘子,因此将所有 p 值相加。如果k &gt;= n,你就完成了。现在,对于每个不能清洗的盘子,再次减去 p 并同时减去 d,例如从总数中减去p + d

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

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

这是紧凑的形式:

java.util.Scanner in = new java.util.Scanner(System.in);
int n = in.nextInt(), k = in.nextInt(), pd[] = new int[n];
long total = 0;
for (int i = 0; i < n; i++) {
    int p = in.nextInt(), d = in.nextInt();
    total += p;
    pd[i] = p + d;
}
java.util.Arrays.sort(pd);
for (int i = n - k - 1; i >= 0; i--)
    total -= pd[i];
System.out.println(Math.max(0, total));

【讨论】:

    【解决方案2】:

    最好使用nextLine 函数来读取完整的行作为输入:

    String s = in.nextLine();
    

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

    【讨论】:

      猜你喜欢
      • 2012-05-07
      • 1970-01-01
      • 2013-09-22
      • 2011-07-07
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多