题目描述:
给定一个字符串 s 和一个整数 k,从字符串开头算起,每 2k 个字符反转前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
算法思想:
1.首先写一个字符数组的反转算法,其中数组反转进行的条件是当left指针小于right指针,换一句话讲就是当left指针与right指针相遇或者是越过后,数组就不会在进行交换。
2.在反转函数中,只需要考虑2k长度为单位的字符串,即每次交换的数组的left指针的开始处是i(i每次变化是2k)处,结束处为i+k或者字符串长度(两者中比较小的那个),
代码实现:
public String reverseStr(String s, int k) { //反转字符串,其中每2k长度的字符串作为一个考虑范围 int n=s.length(); //获得字符串的长度 char []arr=s.toCharArray();//将字符串的字符转换成数组 for(int i=0;i<n;i+=2*k){ reserve(arr,i,Math.min(i+k,n)); } return new String(arr); } public void reserve(char []arr,int left,int right){ //字符串反转 while(left<right){ //只有字符串中的左面指针小于右面指针的时候,才能进行 char temp; temp=arr[left]; arr[left]=arr[right]; arr[right]=temp; left++; right--; } }