181、反轉字符串

題目描述:
給定一個字符串和一個整數 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--;
        }
       
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章