題目描述:
給定一個字符串和一個整數 k,你需要對從字符串開頭算起的每個 2k 個字符的前k個字符進行反轉。如果剩餘少於 k 個字符,則將剩餘的所有全部反轉。如果有小於 2k 但大於或等於 k 個字符,則反轉前 k 個字符,並將剩餘的字符保持原樣。
示例:
輸入: s = “abcdefg”, k = 2
輸出: “bacdfeg”
要求:
該字符串只包含小寫的英文字母。
給定字符串的長度和 k 在[1, 10000]範圍內。
首先這是一道步長求反的題目,因此我設置了一個開關開來檢測是否需要進行球反,然後設置一個步長爲k,需要注意的是首指針爲i,尾部指針需要判斷一下再賦值,因爲可能超過了長度;
代碼如下:
class Solution {
public String reverseStr(String s, int k) {
//每2k個字符,其中前k個反轉,後面k個不反轉
char[] tem = s.toCharArray();
//默認是反轉的,步長爲k
boolean flag = true;
for (int i = 0; i < tem.length; i+=k) {
if(flag){
int start = i;
int end = i + k -1;
if(i + k > tem.length){
end = tem.length - 1;
}else {
end = i + k - 1;
}
while (start < end) {
char te = tem[start];
tem[start] = tem[end];
tem[end] = te;
start ++;
end -- ;
}
flag = !flag;
}else {
flag = !flag;
}
}
return new String(tem);
}
}
排名靠前的代碼,他這裏的步長就是2k了,但是也判斷了尾部的長度和本身的length。
class Solution {
public String reverseStr(String s, int k) {
char[] arr=s.toCharArray();
//一個for循環,每次過2k個元素
for(int i=0;i<=arr.length-1;i += 2*k){
//每次逆轉的右邊界是i+k-1(正常)和末尾(最後不夠k個了)之間的最小值
reverse(arr,i,Math.min(i+k-1,arr.length-1));//一定要注意,要逆轉k個元素,則爲i到i+k-1,不是i+k
}
String res=new String(arr);//把字符數組轉化爲字符串
return res;
}
//逆轉arr數組中start和end之間的元素
public void reverse(char[] arr,int start,int end){
while(start<=end){
char tmp=arr[start];
arr[start]=arr[end];
arr[end]=tmp;
start++;
end--;
}
}
}