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);
运行结果: