我看了看,但找不到合适的答案。
无论如何,这就是问题所在:
下面是函数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)
答案 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);