学习java作为我的第一语言,我在codingbat找到了解决问题的方法,但我不明白为什么我的解决方案不起作用,并且非常乐意帮助你。
给定一个任意长度的字符串,返回最后一个2的新字符串 字符(如果存在)被交换,因此“编码”产生“共线”。
lastTwo(“编码”)→“codign”
lastTwo(“cat”)→“cta”
lastTwo(“ab”)→“ba”
这是我的工作代码:
public String lastTwo(String str) {
int strLength = str.length();
String last = str.substring(strLength-1,strLength);
String bLast = str.substring(strLength-2,strLength-1);
if(strLength<2)
return str;
return str.substring(0, strLength-2)+last+bLast;
}
这是错误,我无法弄清楚原因:
lastTwo( “a”)的 →
“异常:java.lang.StringIndexOutOfBoundsException:String index超出范围:-1(行号:5)“
lastTwo(”“) →
“异常:java.lang.StringIndexOutOfBoundsException:String index超出范围:-1(行号:4)“
当输入小于2个字符时似乎存在问题,但我无法弄清楚原因。对我来说,if逻辑看起来没问题。
答案 0 :(得分:0)
当输入为1个字符时,strLength-2
为-1
。方法substring
抛出错误,因为此索引不存在。 (这同样适用于0 char和strLength-1
)
答案 1 :(得分:0)
如果方法中的条件为:
,则需要移动public static void main(String[] args) {
System.out.println(lastTwo("coding"));
System.out.println(lastTwo("cat"));
System.out.println(lastTwo("ab"));
System.out.println(lastTwo("a"));
}
public static String lastTwo(String str) {
int strLength = str.length();
if(strLength<2)
return str;
String last = str.substring(strLength-1,strLength);
String bLast = str.substring(strLength-2,strLength-1);
return str.substring(0, strLength-2)+last+bLast;
}
这将打印:
codign
CTA
巴
一个
在方法中,如果str
的长度小于2(例如1),那么它将被返回,否则它将计算last
和blast
,然后执行操作。
答案 2 :(得分:0)
您必须将此验证放在首位
if(strLength<2)
return str;
当你有这个代码时,如果字符串是&#34;&#34;,它试图获得位置-1,0和-2,-1之间的子串。您不能在低于0的位置获取子字符串。
int strLength = str.length();
String last = str.substring(strLength-1,strLength);
String bLast = str.substring(strLength-2,strLength-1);
答案 3 :(得分:0)
更简单的解决方案是采用字符串开头和
追加last-char然后
追加before-last-char:
public static String lastTwo(String str) {
if (str.length()<2){
return str;
} else{
return str.substring(0, str.length() - 2) +
str.charAt(str.length() - 1) +
str.charAt(str.length() - 2);
}
}
答案 4 :(得分:0)
public String lastTwo(String str) {
if(str != null ) {
int strLength = str.length();
if (strLength < 2)
return str;
String last = str.substring(strLength-1,strLength);
String bLast = str.substring(strLength-2,strLength-1);
return str.substring(0, strLength-2)+last+bLast;
}
return null;
}
代码中的问题是String bLast = str.substring(strLength-2,strLength-1);
当strLength = 1并且你减去2并且你的索引将是-1时,因此IndexOutOfboundException
发生。
使用上面的代码解决了你的问题。
答案 5 :(得分:0)
substring的一个重载可以采用起始索引,它计算出最后一个索引。所以下面应该给你最后两个字符:
str.substring(java.lang.Math.max(0,str.length()-2))