import java.io.*;
import java.math.*;
import java.util.*;
import java.lang.Math;
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
int i=0;
int a=0;
int b=0;
int count=0 ;
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
String s = scan.nextLine();
while (i <s.length()) {
a = 0;
b = 0;
if (s.charAt(i) == 'D') {
while (s.charAt(i) == 'D') {
a++;
i++;
}
while (s.charAt(i) == 'U') {
b++;
i++;
}
if (a == b)//unable to enter this block
{
++count;
System.out.println(count);
}
} else {
while (s.charAt(i) == 'U') {
b++;
i++;
}
while (s.charAt(i) == 'D') {
a++;
i++;
}
if (a == b)//unable to enter this block
{
++count;
System.out.println(count);
}
}
}
System.out.println(count);
}
}
计数值没有改变,我想这背后的原因可能是流无法进入if(a==b)
块。有人能澄清一下吗?
上述代码的输入如下
样本输入
8
UDDDUDUU
并且预期输出是
1
您的代码中有两个问题:
- 使用
nextInt()
而不是nextLine()
。查看此以了解更多信息 - 不进行检查,
i < s.length()
在您检查s.charAt(i) == 'D'
的任何地方,因此索引超出了范围
顺便说一句,正是因为您想知道a == b
是否为真,我还在每次检查a == b
之前打印了a
和b
的值。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int i = 0, a = 0, b = 0, count = 0;
Scanner scan = new Scanner(System.in);
int n = Integer.parseInt(scan.nextLine());
String s = scan.nextLine();
while (i < s.length()) {
a = 0;
b = 0;
if (s.charAt(i) == 'D') {
while (i < s.length() && s.charAt(i) == 'D') {
a++;
i++;
}
while (i < s.length() && s.charAt(i) == 'U') {
b++;
i++;
}
System.out.println("First: a = " + a + ",b = " + b);
if (a == b) {
++count;
System.out.println(count);
}
} else {
while (i < s.length() && s.charAt(i) == 'U') {
b++;
i++;
}
while (i < s.length() && s.charAt(i) == 'D') {
a++;
i++;
}
System.out.println("Second: a = " + a + ",b = " + b);
if (a == b) {
++count;
System.out.println(count);
}
}
}
System.out.println(count);
}
}
输出:
8
UDDDUDUU
Second: a = 3,b = 1
Second: a = 1,b = 1
1
Second: a = 0,b = 2
1
请清楚地提出您的问题-问题陈述是什么。
无论如何,以下应该有效:
public static void main(String[] args) {
int i = 0;
int a = 0;
int b = 0;
int count = 0;
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
String s = scan.next();
while (i < s.length()) {
a = 0;
b = 0;
if (s.charAt(i) == 'D') {
while (i<s.length() && s.charAt(i) == 'D') {
a++;
i++;
}
while (i<s.length() && s.charAt(i) == 'U') {
b++;
i++;
}
if (a == b)
{
++count;
}
} else {
while (i<s.length() && s.charAt(i) == 'U') {
b++;
i++;
}
while (i<s.length() && s.charAt(i) == 'D') {
a++;
i++;
}
if (a == b)
{
++count;
}
}
}
System.out.println(count);
}
此问题是由于同时使用nextLine()
和nextInt()
方法而导致的。nextInt()
将只读取int值,并且不考虑返回行,因此光标将位于int值之后和返回行之前。
并且CCD_ 13将读取从光标所在位置开始的包括返回线符号的整行
因此,在您的情况下,在使用nextInt()
之后,我们的光标刚好在8
之后,在返回行之前,nextLine()
方法将读取从光标开始的行,这将只得到返回行符号,所以您的String值实际上是"\n",所以实际上您的String大小为0,它将永远无法进入while (i <s.length())
块,你的问题与if(a==b)
无关,因为它永远不会达到目的。
你可以通过打印s.length()
来查看我的解释,你会看到你会得到0。
要解决此问题,您有两个解决方案:
-
只使用
nextLine()
方法,只需使用nextLine()
方法更改读取变量n的行int n = Integer.parseInt(scan.nextLine());
-
或者通过将
String s
的读取方式更改为来使用next()
和nextInt()
String s = scan.next();
这里的
scan.next()
的行为方式与nextInt()
相同,它将读取下一个String值(仅下一个单词,如果有空格,它不会读取空格后面的内容(,并且它将忽略返回行。
你可以在这里阅读更多关于
PS:这将解决您所要求的问题,但我不确定您的代码是否正在解决您正在处理的问题声明。
你可以在下面找到我对计数山谷问题的解决方案,我对你的代码做了一些更改,我在HackerBank上被接受了;(
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
int i=0;
int a=0;
int b=0;
int count=0 ;
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
String s = scan.next();
while (i <s.length()) {
if (s.charAt(i) == 'D')
a++;
if (s.charAt(i) == 'U') {
b++;
if (a == b)
++count;
}
i++;
}
System.out.println(count);
}
}
while (s.charAt(i) == 'U') {
b++;
i++;
}
意味着您将计算有多少个"U",直到下一个字符为"D"。如果U和D像UDUD或UUDD一样连续相等,它将停止,对于UUUD,您永远不会得到a == b
,因此它永远不会进入块。