为什么在我下面的代码中无法输入if(a==b)块

  • 本文关键字:if 代码 java
  • 更新时间 :
  • 英文 :

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

您的代码中有两个问题:

  1. 使用nextInt()而不是nextLine()。查看此以了解更多信息
  2. 不进行检查,i < s.length()在您检查s.charAt(i) == 'D'的任何地方,因此索引超出了范围

顺便说一句,正是因为您想知道a == b是否为真,我还在每次检查a == b之前打印了ab的值。

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。

要解决此问题,您有两个解决方案:

  1. 只使用nextLine()方法,只需使用nextLine()方法更改读取变量n的行

    int n = Integer.parseInt(scan.nextLine());
    
  2. 或者通过将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,因此它永远不会进入块。

最新更新