在字符串

时间:2015-10-04 09:02:02

标签: java

学习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逻辑看起来没问题。

6 个答案:

答案 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),那么它将被返回,否则它将计算lastblast,然后执行操作。

答案 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))