日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode.917-只反转字母(Reverse Only Letters)

發(fā)布時間:2025/4/16 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode.917-只反转字母(Reverse Only Letters) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這是悅樂書的第353次更新,第378篇原創(chuàng)

01 看題和準(zhǔn)備

今天介紹的是LeetCode算法題中Easy級別的第215題(順位題號是917)。給定一個字符串S,返回“反向”字符串,其中所有非字母的字符都保留在同一位置,并且所有字母都反轉(zhuǎn)其位置。例如:

輸入:“ab-cd”
輸出:“dc-ba”

輸入:“a-bC-dEf-ghIj”
輸出:“j-Ih-gfE-dCba”

輸入:“Test1ng-Leet = code-Q!”
輸出:“Qedo1ct-eeLg = ntse-T!”

注意

  • S.length <= 100

  • 33 <= S[i].ASCIIcode <= 122

  • S不包含\或“

02 第一種解法

使用雙指針

定義兩個指針i和j,一個從前往后,一個從后往前,只有兩個指針?biāo)谠囟际亲帜笗r才交換位置,如果其中一個不是字母,就向前前進一步繼續(xù)判斷,如果兩個指針?biāo)谠囟疾皇亲帜妇屯瑫r向前移動。

此解法的時間復(fù)雜度是O(N),空間復(fù)雜度是O(N)。

public String reverseOnlyLetters(String S) {int i = 0, j = S.length()-1;char[] arr = S.toCharArray();while (i < j) {char c = arr[i];char c2 = arr[j];if (Character.isLetter(c) && Character.isLetter(c2)) {arr[i] = c2;arr[j] = c;i++;j--;} else if (!Character.isLetter(c) && Character.isLetter(c2)) {i++;} else if (Character.isLetter(c) && !Character.isLetter(c2)) {j--;} else if (!Character.isLetter(c) && !Character.isLetter(c2)) {i++;j--;}}return new String(arr); }


03 第二種解法

在雙指針的基礎(chǔ)上做了下變動,使用StringBuilder來拼接新的字符,但是雙指針的思路沒變。

此解法的時間復(fù)雜度是O(N),空間復(fù)雜度是O(N)。

public String reverseOnlyLetters2(String S) {int j = S.length()-1, n = S.length();StringBuilder sb = new StringBuilder();for (int i=0; i<n; i++) {if (Character.isLetter(S.charAt(i))) {while (j>=0 && !Character.isLetter(S.charAt(j))) {j--;}sb.append(S.charAt(j--));} else {sb.append(S.charAt(i));}}return sb.toString(); }


04 第三種解法

利用棧,借助其先進后出的特性。

先將S中的字母全部入棧,然后再遍歷S中的字符,如果是字母,就從棧頂取一位元素出來拼接,不是字母,就直接拼接當(dāng)前元素。

此解法的時間復(fù)雜度是O(N),空間復(fù)雜度是O(N)。

public String reverseOnlyLetters3(String S) {Stack<Character> stack = new Stack<Character>();char[] arr = S.toCharArray();for (char c : arr) {if (Character.isLetter(c)) {stack.push(c);}}StringBuilder sb = new StringBuilder();for (char c : arr) {if (Character.isLetter(c)) {sb.append(stack.pop());} else {sb.append(c);}}return sb.toString(); }


05 小結(jié)

算法專題目前已連續(xù)日更超過六個月,算法題文章221+篇,公眾號對話框回復(fù)【數(shù)據(jù)結(jié)構(gòu)與算法】、【算法】、【數(shù)據(jù)結(jié)構(gòu)】中的任一關(guān)鍵詞,獲取系列文章合集。

以上就是全部內(nèi)容,如果大家有什么好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉(zhuǎn)發(fā)就是對我最大的回報和支持!

轉(zhuǎn)載于:https://www.cnblogs.com/xiaochuan94/p/11020782.html

總結(jié)

以上是生活随笔為你收集整理的LeetCode.917-只反转字母(Reverse Only Letters)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。