字符串移位

时间:2015-01-07 17:39:41

标签: java string

我看了看,但找不到合适的答案。

无论如何,这就是问题所在:

下面是函数shiftString(),其类型参数为String和Integer。填写代码以将参数字符串字符移位移位量。示例:"测试"向2移动将等于" ngtesti"和"测试"偏移-2将等于" stingte"。

这是我的代码:

public class Main {

public String shiftString(String string, int shift) {

   String answer = string.substring(string.length() - shift) + string.substring(0, string.length() - shift);
    return answer;
}

这是我的错误:

  

线程中的异常" main" java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-6 at java.lang.String.substring(String.java:1875)at ghtBQvETRGjbIqd $ Main.shiftString(ghtBQvETRGjbIqd.java:6)at ghtBQvETRGjbIqd。(ghtBQvETRGjbIqd.java: 14)在ghtBQvETRGjbIqd.main(ghtBQvETRGjbIqd.java:11)​​

4 个答案:

答案 0 :(得分:0)

我认为这会奏效......

shift = ( ( shift % string.length() ) + string.length() ) % string.length;

第一个%将它放入范围(-string.length().. string.length())

加法使其进入范围(0 .. 2 * string.length())

最终的%将其放入范围[0 .. string.length())

(当然,只是连接子串[shift .. string.length() - 1]和[0 .. shift])

答案 1 :(得分:0)

处理移位大于字符串长度的边缘情况。

当有负数时处理大小写,然后你从长度子串 - 移位到长度并从0变为长度 - 移位

当存在正向移位时的处理情况它是从移位+ 1移动到长度并移0移位

public static String shiftString(String string, int shift) {
   if(Math.abs(shift) > string.length()) return string; //or exception
   boolean negative = shift != Math.abs(shift);
   shift = Math.abs(shift);
   return negative? string.substring(string.length()-shift, string.length()) + string.substring(0, string.length()-shift) : string.substring(shift+1) + string.substring(0, shift);
}

答案 2 :(得分:0)

分解,简化。这个解决方案不是很快,但出于教育目的,你应该保持它的整洁而不是超级优化:

@Test
public void tests() {
    assertThat(last("abc"), is('c'));
    assertThat(first("abc"), is('a'));
    assertThat(shiftRight("abc"), is("cab"));
    assertThat(shiftLeft("abc"), is("bca"));
    assertThat(shiftString("testing", 2), is("ngtesti"));
    assertThat(shiftString("testing", -2), is("stingte"));

    assertThat(shiftString("testing", 999), is("stingte")); // Big numbers should work
}


public String shiftString(String string, int shift) {
    if (shift == 0) {
        return string;
    }

    if (shift > 0) {
        return shiftString(shiftRight(string), shift - 1);
    } else {
        return shiftString(shiftLeft(string), shift + 1);
    }
}

private String shiftLeft(final String string) {
    return string.substring(1) + first(string);
}

private String shiftRight(final String string) {
    return last(string) + string.substring(0, string.length() - 1);
}

private char last(final String string) {
    return string.charAt(string.length() - 1);
}

private char first(final String string) {
    return string.charAt(0);
}

答案 3 :(得分:0)

试试这个..

int length=string.length();
String answer = string.substring((length-shift)%length)+string.substring(0,(length-shift)%length);
System.out.println(answer);