题目:
1)将字符串指定部分进行反转。比如将“abcdef”反转为“aedcbf”
2)编写方法 public static String reverse(String str,int start,int end)
代码:
法一:将指定部分子串转为字符数组后反转再返回
public static String reverse(String str , int start, int end){
if(!(str != null && start >= 0 && end > start && end < str.length())){
throw new RuntimeException("参数不正确!");
}
char[] array = str.toCharArray();
char temp = ' ';
//交换两个字符的值达到反转的目的
for(int i = start,j = end; i < j;i++,j--){
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
//使用chars 重新构建一个String 返回即可
return new String(array);
}
法二:用一个字符串拷贝未指定部分,指定部分从后往前依次加入字符串,再返回字符串
(该方法较呆,不推荐)
public static String reverse(String str, int start,int end){
if(!(str != null && start >= 0 && end > start && end < str.length())){
throw new RuntimeException("参数不正确!");
}
//将未指定前部分子串存入
String reverseStr = str.substring(0,start);
//将指定部分子串存入
//这样会在常量池中一直创建新字符串,导致效率低
for(int i = end ; i >= start; i--){
reverseStr += str.charAt(i);
}
//将未指定后部分子串存入
reverseStr += str.substring(end + 1);
return reverseStr;
}
法三:通过StringBuilder/StringBuffer进行append(),本质上是第二种方法的优化
public String reverse(String str,int start,int end){
if(!(str != null && start >= 0 && end > start && end < str.length())){
throw new RuntimeException("参数不正确!");
}
StringBuilder builder = new StringBuilder();
//将非指定前子串append到builder中
builder.append(str.substring(0,start));
//倒序将指定子串中的字符append到builder中
for(int i = end;i >= start;i--){
builder.append(str.charAt(i));
}
//将非指定后子串append到builder中
builder.append(end + 1);
//将builder转换成String型并返回
return builder.toString();
}
三种方法可根据场景选择,但最重要的是不要忘记对输入的参数进行验证
if(!(str != null && start >= 0 && end > start && end < str.length())){
throw new RuntimeException("参数不正确!");
}