博客 / 詳情

返回

算法 - 字符串 - 反轉字符串

題目1

力扣 344題, 反轉字符串

編寫一個函數,其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 s 的形式給出。

不要給另外的數組分配額外的空間,你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。

 

示例 1:

輸入:s = ["h","e","l","l","o"]
輸出:["o","l","l","e","h"]
示例 2:

輸入:s = ["H","a","n","n","a","h"]
輸出:["h","a","n","n","a","H"]

來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/reverse-string
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

解法:雙指針

class Solution {
    public void reverseString(char[] s) {
        int left = 0;
        int right = s.length-1;
        while(left < right){
            char t = s[left];
            s[left] = s[right];
            s[right] = t;
            left++;
            right--;
        }
    }
}

題目2

力扣 541題 反轉字符串II

給定一個字符串 s 和一個整數 k,從字符串開頭算起,每計數至 2k 個字符,就反轉這 2k 字符中的前 k 個字符。

如果剩餘字符少於 k 個,則將剩餘字符全部反轉。
如果剩餘字符小於 2k 但大於或等於 k 個,則反轉前 k 個字符,其餘字符保持原樣。
 

示例 1:

輸入:s = "abcdefg", k = 2
輸出:"bacdfeg"
示例 2:

輸入:s = "abcd", k = 2
輸出:"bacd"

來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/reverse-string-ii
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

解法:雙指針

class Solution {
    public String reverseStr(String s, int k) {

        char[] chars = s.toCharArray();

        int length = chars.length;

        for(int i = 0; i*k < length; i++){
            if(i%2 == 0){
                int end = i*k+k-1;
                if (i*k+k-1 >= length){
                    end = length-1;
                }
                reverseArray(chars, i*k, end);
            }
        }

        return new String(chars);
    }
    
    // 反轉數組區間
    public void reverseArray(char[] chars, int start, int end) {
        int offset = 0;
        for(int i = start; i <= (start+end)/2; i++){
            char tmp = chars[start + offset];
            chars[start + offset] = chars[end - offset];
            chars[end - offset] = tmp;
            offset++;
        }
    }
}
user avatar nick_58a54a169c75f 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.