以下程序是hackerrank的THRONES-1游戏问题。但是我在执行时遇到了给定的错误。 如果有人能提供帮助,我将不胜感激。 错误是:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
at java.lang.String.charAt(String.java:646)
这是我的代码
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
import java.util.Arrays;
public class try123
{
public static void main(String[] args)
{
Scanner myScan = new Scanner(System.in);
String inputString = myScan.nextLine();
String s=inputString; //abccba
String ans; //YES or NO
String A="";
int flag=0;
String news="";
String nrev="";
String rev="";
//char arr[]=new char[100000];
char arr[]=inputString.toCharArray();
Arrays.sort(arr);
String b= new String(arr); //sorted string
int len=b.length();
if((len%2)!=0)
{
A=b.substring(len-1,len);
len=len-1;
b=b.substring(len-1);
flag=1;
}
for(int l=(len-1);l>=0;l--)
{
rev=rev+b.charAt(l);
}
for(int i=1;i<len;i=i+2) //len=6
{
news=news+b.charAt(i)+rev.charAt(i-1);
}
if(flag==1)
news=news.substring(0,(len/2)-1)+A+news.substring((len/2),len-1);
for(int o=(news.length()-1);o>=0;o--)
{
nrev=nrev+b.charAt(o);
}
if(news==nrev)
ans="YES";
else
ans="NO";
System.out.println(ans);
myScan.close();
}
}
答案 0 :(得分:0)
问题似乎在这里:
for(int i=1;i<len;i=i+2) //len=6
{
news=news+b.charAt(i)+rev.charAt(i-1);
}
您将i增加2,因此对于偶数len
值,您将超出字符串的字符数限制(这就是您看到此异常的原因)
java.lang.StringIndexOutOfBoundsException: String index out of range
答案 1 :(得分:0)
这些行会引发错误:
if ((len % 2) != 0) {
A = b.substring(len - 1, len);
len = len - 1;
b = ;
flag = 1;
}
for (int l = (len - 1); l >= 0; l--) {
rev = rev + b.charAt(l);
}
在这些行之前,len
是b
的长度,在第三行,它变为b的长度 - 1,然后你输入b
b.substring(len - 1)
,这意味着:b的最后2个字符。
现在b是2个字符长,但len仍然是原始长度 - 1。
然后设置int l = (len - 1)
,然后执行b.charAt(l)
。 B长度为2个字符,您尝试访问超出范围的第l个字符。
答案 2 :(得分:0)
问题在于:
if((len%2)!=0)
{
A=b.substring(len-1,len);
len=len-1;
b=b.substring(len-1); // this returns a String with the last 2 characters of
// the original
flag=1;
}
当输入String的长度为奇数时,您只保留该String的最后两个字符。
我认为你的意思是只删除字符串的最后一个字符,应该这样做:
if((len%2)!=0)
{
A=b.substring(len-1,len);
len=len-1;
b=b.substring(0,len); // this would return the original String minus the last
// character
flag=1;
}