这个问题是从Hackerrank复制的:
加里是一个狂热的徒步旅行者。他精心追踪他的徒步旅行,密切关注地形等小细节。在他最后一次徒步旅行中,他采取了一些措施。对于他采取的每一步,他都注意到这是一个上坡还是一个下坡的步骤。加里的徒步在海平面开始和结束。我们定义以下术语:一座山是海平面以上连续阶梯的非空序列,从海平面上升一步,一步到海平面。
山谷是海平面以下连续阶梯的非空序列,从海平面向下逐步开始,向海平面逐步结束。鉴于加里在上次徒步旅行期间的上下步骤,找到并打印他走过的山谷数量。
输入格式:
第一行包含一个整数,表示加里加息中的步数。
第二行包含单个字符串。每个字符都是(其中U表示向上迈步,D表示向下逐步),字符串中的字符描述了加里在徒步旅行中的步骤。
约束:
输出格式:
打印一个整数,表示加里在徒步旅行期间走过的山谷数量。
示例输入:
8 UDDDUDUU
示例输出: 1
说明: 如果我们将_表示为海平面,将步骤表示为/,并逐步降低为\,加里的徒步旅行可以表示为:
_/\ _ \ / \/\/
很明显,那里只有一个山谷,所以我们在一条新线上打印。
这是我提交的解决方案:
import java.io.*;
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
String arr = "";
for(int i = 0; i < n; i++){
arr += scan.next();
}
int total = 0;
int counter = 0;
boolean isValley = false;
String sub = "";
for(int i = 0; i < arr.length(); i++){
sub = arr.substring(i, i + 1);
if(sub.equals("U")){
total++;
}
if(sub.equals("D")){
total--;
}
if(total == 0){
isValley = true;
}
if(total < -1 && isValley){
counter++;
isValley = false;
}
}
System.out.println(counter);
}
}
我不确定为什么,但是ide会抛出这个错误:
线程中的异常&#34; main&#34; java.util.Scanner.throwFor(Scanner.java:862)java.util.NoSuchElementException,java.util.Scanner.next(Scanner.java:1371)at Solution.main(Solution.java:12)
答案 0 :(得分:1)
Scanner#next
读取整个令牌,而不是字符。在for
循环
arr += scan.next();
在第一遍中消耗UDDDUDUU
。第二遍没有什么可读的。因此,java.util.NoSuchElementException
。