1.将String中指定位置进行反转
1.1问题阐述
举个例子:“abcdefg”字符串中指定2到5号位置进行反转,-------》"abfedcg"
1.2问题解决思路
如果题目阐述全部进行反转:则直接调用StringBuffer类里面的reverse()方法即可,但现在需要有指定位置,所以我们需要自己实现,调用String里面的相关方法,我们有如下3个解决思路:
思路一
我们可以将“abcdefg”先转换为字符数组,调用tocharArray()方法,保存在一个arr数组里面,然后在arr数组里面从指定位置2开始,将2赋值给start,5赋值给end,将2号和5号位置交换,即start和end交换,然后start++,end--,直到srart>end
下面我们来看下整体的代码:
public String reverse(String str,int start,int end){
if (str == null||str.length() == 0){
return null;
}
char[] arr = str.toCharArray();//将字符串转换为字符数组
for (int x = start, y= end;x< y;x++,y--){
char tmp = arr[x];
arr[x] = arr[y];
arr[y] = tmp;
}
return new String(arr);
}
测试用例:
String str = "abcdefg";
String reverse = reverse2(str, 2, 5);
System.out.println(reverse);
运行结果:
思路二:
思路一里面没有用到String类给我们提供的方法,而且,开辟了一个char类型数组,浪费了内存空间。基于这些弊端,在思路二中,我们调用String类提供的方法,比如:字符串"abcdef",从2到5进行反转,先用方法subString(0,2)获取到“ab”,赋值给sub因为左闭右开,不包括2号索引下标,没有字符c,然后从5号下标开始往前进行for循环,用charAt()方法进行获取i号下标的元素,并拼接到sub,最后将剩余的5+1号到结束的字符串用substring()方法拼接给sub。
下面我们来看下代码:
public String reverse1(String str,int start,int end){
if (str == null||str.length() == 0){
return null;
}
String substring = str.substring(0, start);
for (int i = end;i>=start;i--){
substring += str.charAt(i);
}
substring += str.substring(end+1);
return substring;
}
测试用例:
String str = "abcdefg";
String reverse = reverse2(str, 2, 5);
System.out.println(reverse);
运行结果:
思路三
思路三是在思路二的基础上稍作改进,因为我们知道,String类是不可变的序列,每次执行拼接操作时,都要重新开辟内存进行新造,而StringBuilder类是可变的字符序列,每次执行拼接操作时,不用新开辟内存,直接往数组后面拼接。与思路二的思路是一样的
只是更加节省内存空间,下面我们来看下代码:
public String reverse2(String str,int start,int end){
if (str == null||str.length()==0){
return null;
}
StringBuilder builder = new StringBuilder(str.length());
builder.append(str.substring(0,start));
for (int i = end;i>=start;i--){
builder.append(str.charAt(i));
}
builder.append(str.substring(end+1));
return builder.toString();
}
测试用例:
String str = "abcdefg";
String reverse = reverse2(str, 2, 5);
System.out.println(reverse);
运行结果:
谢谢浏览!