代碼隨想錄第 8 天:字符串

字符串第一天,加油!

344.反轉(zhuǎn)字符串

解題思路:

設(shè)置兩個(gè)指針在字符串的首尾,分別交換指針指向的字符串元素即可
Tipp:
java中交換數(shù)值有兩種方法
- temp交換,常規(guī),solution中的
- 位運(yùn)算交換(異或運(yùn)算)
可交換性:ab=ba
可結(jié)合性:abc=(ab)c=a(bc)
自身進(jìn)行異或運(yùn)算值為零:a^a=0
與 0 異或時(shí)結(jié)果不變:a^0=a
實(shí)現(xiàn):
a ^=b;
b ^=a;
a ^=b;

class Solution {
    public void reverseString(char[] s) {
        int l = 0;
        int r = s.length - 1;
        
        char temp;
        while (l < r) {
            temp = s[l];
            s[l] = s[r];
            s[r] = temp;

            l++;
            r--;
        }
    }
}

541. 反轉(zhuǎn)字符串II

解法一:

運(yùn)用雙指針進(jìn)行翻轉(zhuǎn)
1.左指針的位置為每次間隔2k
1.需要判斷右指針的位置
·當(dāng) k<= 剩余字符串長(zhǎng)度 <= 2k時(shí),右指針在i+k-1;
·當(dāng) 剩余字符串長(zhǎng)度 <k 時(shí),右指針直接在字符串末尾,因?yàn)閷⑹S嗟淖址挤崔D(zhuǎn)

class Solution {
    public String reverseStr(String s, int k) {
        int n = s.length();
        char[] arr = s.toCharArray();
        for (int i = 0; i < n; i += (2 * k)) {
            //如果剩余字符大于等于k,但是小于2k時(shí),右指針的點(diǎn)在i+k-1上
            if (i + k <= n) {
                reverse(arr, i, (i+k)-1);
            } else {
                reverse(arr, i, n-1);
            }
        }
        // for (int i = 0; i < n; i += (2 * k)) {
        //     reverse(arr, i, Math.min(i + k, n) - 1);
        // }
        return new String(arr);

    }
    public void reverse(char[] s, int left, int right) {
                //位運(yùn)算實(shí)現(xiàn)翻轉(zhuǎn)函數(shù)
        while (left < right) {
            s[left] ^= s[right];
            s[right] ^= s[left];
            s[left] ^= s[right];
            left++;
            right--;
        }
    }
}
/*復(fù)雜度分析:
時(shí)間復(fù)雜度為O(n),n為s長(zhǎng)度
空間復(fù)雜度為O(n),因?yàn)閷⒆址D(zhuǎn)為了數(shù)組,變成了可以修改的字符串;java中String不可修改
*/

題目:劍指Offer 05.替換空格

解題思路:

依次讀取s中的字符,檢測(cè)是否為空格,如果是就添加%20;不是就讀原字符

class Solution {
    public String replaceSpace(String s) {
        StringBuilder res = new StringBuilder();
        for (char c : s.toCharArray()) {
            if (c == ' ') {
                res.append("%20");
            } else {
                res.append(c);
            }
        }
        return res.toString();
    }
}

    /*
    時(shí)間復(fù)雜度為O(n),n為字符串長(zhǎng)度
    空間復(fù)雜度為O(n),n為原字符長(zhǎng)度+2*空格數(shù)量
    */

題目:劍指Offer58-II.左旋轉(zhuǎn)字符串

解題思路:雙指針

實(shí)現(xiàn)三次反轉(zhuǎn),運(yùn)用自己寫(xiě)的reverse函數(shù)
1.先將0到n的字符翻轉(zhuǎn)
2.再將n+1到末尾的字符反轉(zhuǎn)
3.最后將整個(gè)字符翻轉(zhuǎn)
其中翻轉(zhuǎn)函數(shù)還是用雙指針

class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder res = new StringBuilder(s);
        reverseString(res, 0, n-1);
        reverseString(res, n, s.length()-1);
        return res.reverse().toString();

    }
    public void reverseString(StringBuilder res, int left, int right) {
        char temp;
        while (left < right) {
            temp = res.charAt(left);
            res.setCharAt(left, res.charAt(right));
            res.setCharAt(right, temp);
            left++;
            right--;       
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容