算法通關村第十二關|白銀|字符串經典基礎面試題

1.反轉問題

1.1 反轉字符串

原題:力扣344.

要求原地修改。

public void reverseString(char[] s) {if (s == null || s.length() == 0) {return;}int n = s.length;for (int left = 0, right = n - 1; left < right; left++, right--) {char temp = s[left];s[left] = s[right];s[right] = temp;}
}

1.2 K個一組反轉

原題:力扣541.

public String reverseStr(String s, int k) {if (s == null || s.length() == 0) {return s;}int n = s.length();char[] arr = s.toCharArray();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[] arr, int left, int right) {while (left < right) {char temp = arr[left];arr[left] = arr[right];arr[right] = temp;left++;right--;}
}

1.3 僅僅反轉字母

原題:力扣917.

1.轉換為數組,使用雙指針,兩個都指向字母就互換位置,否則就移動不是指向字母的指針。

class Solution {public String reverseOnlyLetters(String s) {if (s == null || s.length() == 0) {return s;}int left = 0, right = s.length() - 1;char[] arr = s.toCharArray();while (left < right) {if (Character.isLetter(arr[left]) && Character.isLetter(arr[right])) {char temp =  arr[left];arr[left] = arr[right];arr[right] = temp;left++;right--;} else if (Character.isLetter(arr[left])) {right--;} else if (Character.isLetter(arr[right])) {left++;} else {left++;right--;}}return new String(arr);}
}

2.使用棧。

class Solution {public String reverseOnlyLetters(String s) {Stack<Character> letters = new Stack();for (char c : s.toCharArray()) {if (Character.isLetter(c)) {letters.push(c);}}StringBuilder ans = new StringBuilder();for (char c : s.toCharArray()) {if (Character.isLetter(c)) {ans.append(letters.pop());} else {ans.append(c);}}return ans.toString();}
}

3.維護一個指針從后向前遍歷數組,需要字母的時候使用。

class Solution {public String reverseOnlyLetters(String s) {if (s == null || s.length() == 0) {return s;}StringBuilder ans = new StringBuilder();int j = s.length() - 1;for (int i = 0; i < s.length(); i++) {if (Character.isLetter(s.charAt(i))) {while (!Character.isLetter(s.charAt(j))) {j--;}ans.append(s.charAt(j--));} else {ans.append(s.charAt(i));}}return ans.toString();}
}

1.4 反轉字符串里的單詞

原題:力扣151.

1.調用API。

public String reverseWords(String s) {if (s == null || s.length() == 0) {return s;}s = s.trim();List<String> wordList = Arrays.asList(s.split("\\s+"));Collections.reverse(wordList);return String.join(" ", wordList);
}

2.自己實現。

class Solution {public String reverseWords(String s) {StringBuilder sb = trimSpaces(s);reverse(sb, 0, sb.length() - 1);reverseEachWord(sb);return sb.toString();}public StringBuilder trimSpaces(String s) {int left = 0, right = s.length() - 1;while (left <= right && s.charAt(left) == ' ') {left++;}while (left <= right && s.charAt(right) == ' ') {right--;}StringBuilder sb = new StringBuilder();while (left <= right) {char c = s.charAt(left);if (c != ' ') {sb.append(c);} else if (sb.charAt(sb.length() - 1) != ' ') {sb.append(c);}left++;}return sb;}// 將整個字符串進行翻轉public void reverse(StringBuilder sb ,int left, int right) {while (left < right) {char temp = sb.charAt(left);// String 沒有這個方法,但是 StringBuilder 和 StringBuffer 可以使用// 將指定索引處修改為指定的 char 類型值sb.setCharAt(left++, sb.charAt(right));sb.setCharAt(right--, temp);}}// 針對每個單詞進行翻轉public void reverseEachWord(StringBuilder sb) {int n = sb.length();int start = 0, end = 0;while (start < n) {while (end < n && sb.charAt(end) != ' ') {end++;}reverse(sb, start, end - 1);start = end + 1;end++;}}
}

2.驗證回文串

原題:力扣125.

public boolean isPalindrome(String s) {if (s == null || s.length() == 0) {return s;}StringBuffer sgood = new StringBuffer();int length = s.length();for (int i = 0; i < length; i++) {char ch = s.charAt(i);if (Character.isLetterOrDigit(ch) {sgood.append(Character.toLowerCase(ch));}}int n = sgood.length();int left = 0, right = n - 1;while (left < right) {if (sgood.charAt(left) != sgood.charAt(right)) {return false;}left++;right--;}return true;
}

3.字符串中的第一個唯一字符

原題:力扣387.

public int firstUniqChar(String s) {if (s == null || s.length() == 0) {return 0;}Map<Character, Integer> frequency = new HashMap<>();for (int i = 0; i < s.length(); i++) {char ch = s.charAt(i);frequency.put(ch, frequency.getOrDefault(ch, 0) + 1);}for (int i = 0; i < s.length(); i++) {if (frequency.get(s.charAt(i)) == 1) {return i;}}return -1;
}

4.判定是否互為字符重排

原題:力扣242.

只需要判斷字符種類以及每個種類出現的次數是否相同,相同則可以重排。

public boolean checkPermutation(String s1, String s2) {if (s1.length() != s2.length()) {return false;}char[] s1Chars = s1.toCharArray();Map<Character, Integer> s1Map = getMap(s1);Map<Character, Integer> s2Map = getMap(s2);for (char s1Char : s1Chars) {if (!s2Map.containsKey(s1Char) || (int)s2Map.get(s1Char) != (int)s1Map.get(s1Char)) {return false;}}return true;
}public Map<Character, Integer> getMap(String str) {Map<Character, Integer> map = new HashMap<>();char[] chars = str.toCharArray();for (char aChar : chars) {map.put(aChar, map.getOrDefault(aChar, 0) + 1);}return map;
}

如果對您有幫助,請點贊關注支持我,謝謝!?
如有錯誤或者不足之處,敬請指正!?
個人主頁:星不易 ?
算法通關村專欄:不易|算法通關村 ?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163519.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163519.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163519.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小程序訂閱消息

wx.requestSubscribeMessage({tmplIds: [2IdqlWrqSbjAurzIuW8imeK-ftS8gbhYdZ0icdE],success(res) {console.log(res);// 處理用戶授權結果},fail(err) {console.error(err);// 處理授權請求失敗}});

白楊SEO:2B企業營銷是什么?當下主流的短視頻直播平臺有哪些?企業營銷要做短視頻直播選哪個平臺更好?

今天白楊SEO就正式來講講2B企業營銷選擇哪個短視頻直播平臺更好&#xff1f; 圖片在公眾號&#xff1a;白楊SEO上看。 文章大綱提前看&#xff1a; 1、先說說2B企業營銷是什么&#xff1f; 2、當下主流的短視頻直播平臺有哪些&#xff1f; 3、2B企業營銷要做短視頻直播選哪…

重磅!1區、60年老牌期刊被踢?共5本被剔除!11月SCIE/SSCI期刊目錄更新!

期刊動態&#xff1a;2023年11月SCI、SSCI期刊目錄更新 2023年11月20日&#xff0c;科睿唯安更新了WOS期刊目錄&#xff0c;繼上次10月WOS期刊目錄剔除7本SCIE&SSCI期刊之后&#xff0c;此次11月更新又有5本期刊發生變動&#xff0c;其中有4本SCIE期刊被剔除&#xff0c;1…

Postgresql根據兩表相同字段更新其中一個表的其他數據

有兩個表 table1&#xff08;id,pcode,pname,type&#xff09; 初始數據只有id、pcode&#xff0c;pname、type為空table2&#xff08;id,pcode,pname,type&#xff09; 根據table1和table的相同字段pcode&#xff0c;用table2的數據更新table1的pname和type字段。 例如&…

微信運營神器:從群發到批量添加,讓你的微信營銷更輕松

在這個數字化時代&#xff0c;微信已經成為了我們生活中不可或缺的一部分。對于許多企業和個人來說&#xff0c;微信營銷也是非常重要的一部分。但是&#xff0c;微信營銷并不是一件容易的事情&#xff0c;需要花費大量的時間和精力。為了解決這個問題&#xff0c;今天我們將向…

Linux本地MinIO存儲服務遠程調用上傳文件

&#x1f525;博客主頁&#xff1a; 小羊失眠啦. &#x1f3a5;系列專欄&#xff1a;《C語言》 《數據結構》 《Linux》《Cpolar》 ??感謝大家點贊&#x1f44d;收藏?評論?? 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;…

淘寶返利APP草柴如何綁定淘寶賬號?

草柴APP是一款淘寶、天貓、京東大額優惠券領取及購物返利省錢工具。通過草柴APP綁定淘寶賬號&#xff0c;可領取淘寶大額內部隱藏優惠券&#xff0c;領取成功再購物可享券后價優惠&#xff0c;確認收貨后可獲得淘寶返利。 淘寶返利APP草柴如何綁定淘寶賬號&#xff1f; 1、手…

Docker 快速搭建 Gitlab 服務

linux環境&#xff1a; 使用 vim 編輯 hosts 文件&#xff1a; vim /etc/hosts按 I 進入編輯模式&#xff0c;在文件末行追加上虛擬機的 IP 和要設置的域名&#xff1a; 192.168.1.17 gitlab.kunwu.toplwindows環境&#xff1a; Windows 系統的 hosts 文件位于 C:\Windows\S…

萬賓科技智能井蓋傳感器效果,特點有哪些?

現在城市發展越來越好&#xff0c;對基礎設施的改造越來越多&#xff0c;比如修路搭橋、整改生態等都是為民服務的好工程。平時走在路上我們享受著平整的路面&#xff0c;井然有序的交通也為我們帶來很大的方便。但是一個又一個的井蓋看起來無關緊要&#xff0c;實際上如果路上…

Doris的編譯與安裝(二)

安裝 Doris&#xff0c;需要先通過源碼編譯&#xff0c;主要有兩種方式&#xff1a; 使用 Docker 開發鏡像編譯&#xff08;推薦&#xff09;、直接編譯。 直接編譯的方式&#xff0c;可以參考官網&#xff1a;https://doris.apache.org/zh-CN/installing/compilation.html …

投標文件的注意事項

一、檢查標書 1.1有時候標書需要從別的地方復制黏貼文件&#xff0c;記住復制內容可以&#xff0c;但是不要復制“落款和時間”的格式&#xff0c;落款和時間的格式借鑒你的招標文件中給響應文件格式的落款和時間&#xff0c;切記&#xff01; 1.2檢查標書是否有空頁&#xf…

數據科學導論——數據預處理

第1關:引言-根深之樹不怯風折,泉深之水不會涸竭 第2關:數據清理-查漏補缺 import numpy as np import pandas as pd import matplotlib.pyplot as plt def student():train = pd.read_csv(Task1/diabetes_null.csv, na_values=[#NAME?])train[Insulin] = train[Insulin].f…

maxwell采集數據到kafka報錯

問題&#xff1a; 啟動maxwell后出現數據更新后就出現以下報錯。 13:29:14,727 ERROR MaxwellKafkaProducer - TimeoutException Position[BinlogPosition[binlog.000002:12215591], lastHeartbeat1700717043797] -- maxWellData: medical:consultation:[(id,212)] 13:29:14,7…

Raptor安裝

Raptor官網:https://raptor.martincarlisle.com/ 進入官網后&#xff0c;下拉找到 Download RAPTOR&#xff0c;windows系統的選擇Windows Users 下載完成后打開&#xff0c;選擇“next” 修改一下路徑&#xff0c;不要放到C: 繼續next 完結撒花

vue3的單組件的編寫(三)【響應式 API 之 toRef 與 toRefs】

響應式 API 之 toRef 與 toRefs 前面講了 ref 和 reactive 這兩種響應式API &#xff0c;為了方便開發者使用&#xff0c;vue3 還出了兩個用來 reactive 轉換為 ref 的API&#xff0c;分別是 toRef 和 toRefs 。 &#x1f308;什么是toRef 與 toRefs 這兩個API看拼寫能猜到&…

css漸變詳解(重復性線性漸變、徑向漸變、重復性徑向漸變的使用)

目錄 線性漸變 重復性線性漸變 徑向漸變 重復性徑向漸變的使用 線性漸變 線性漸變是向下、向上、向左、向右、對角方向的顏色漸變。 其語法格式為&#xff1a; background-image: linear-gradient(side-or-corner|angle, linear-color-stop); 參數說明如下&#xff1a; …

物聯網網關在智慧農業行業的應用案例

物聯網網關在智慧農業行業的應用案例 隨著科技的發展和普及&#xff0c;智慧農業已經成為了農業領域的一個重要趨勢。在智慧農業中&#xff0c;物聯網網關是一個非常重要的組成部分&#xff0c;它能夠實現對農業設備和環境的實時監控和控制&#xff0c;從而提高農業生產效率和…

服務器不備案的影響

服務器不備案的影響 不備案&#xff0c;不能解析域名。 但凡你的域名綁定到的是國內地址&#xff0c;你不備案&#xff0c;這個域名解析未來就可能會失效。 &#xff08;你借用的其它網站的子域名情況除外&#xff0c;因為他們的網站本身主域名有可能已經備案。&#xff09; …

Linux 安裝顯卡驅動

Linux 安裝顯卡驅動

scrapy框架流程

1、Scrapy從Spider子類中提取start_url,然后構造為request請求對象 2、將request請求對象傳遞給爬蟲中間件 3、將request請求對象傳遞給Scrapy引擎&#xff08;核心代碼&#xff09; 4、將request請求對象傳遞給調度器&#xff08;它負責對多個request安排&#xff0c;好比交…