代碼隨想錄算法訓練營第八天|Leetcode 151.翻轉字符串里的單詞 卡碼網:55.右旋轉字符串 字符串總結 雙指針回顧

151.翻轉字符串里的單詞

建議:這道題目基本把 剛剛做過的字符串操作 都覆蓋了,不過就算知道解題思路,本題代碼并不容易寫,要多練一練。

題目鏈接/文章講解/視頻講解:代碼隨想錄

我們這道題的思路是,先將整個字符串反轉,結束之后再定位每一個單詞,然后再將單詞進行反轉,思路為什么是這樣子的呢

為什么要先翻轉整個字符集,再翻轉單詞,而不是直接翻轉單詞

假設輸入字符串: "hello world"

方法1 (當前代碼采用的方法):
1. 整體翻轉: "dlrow olleh"
2. 單詞翻轉: "world hello"

方法2 (直接翻轉單詞):
這需要:
1. 找到每個單詞的位置
2. 將單詞存儲到新的位置
3. 處理單詞之間的空格
4. 可能需要額外的存儲空間來臨時保存單詞

當前方法的優勢:
1. 空間復雜度低:只需要在原字符串上操作,不需要額外空間存儲單詞
2. 實現簡單:只需要簡單的字符交換操作
3. 時間復雜度穩定:只需要遍歷字符串固定的次數

直接翻轉單詞的劣勢:
1. 需要額外的空間來存儲單詞
2. 需要處理單詞移動的復雜邏輯
3. 實現起來更復雜,容易出錯

?

如果我們直接對單詞進行反轉,我舉個例子

“hello world”

反轉之后應該是“world hello”

如果不將字符串先進行反轉,我們直接反轉的話,需要額外的空間,因為數組的操作從根本上來說是覆蓋操作,那么我們在寫world的時候就會將hello覆蓋,所以我們需要格外的空間存儲hello才行,這樣就把邏輯變復雜了,如果先翻轉再單詞內部反轉,適度簡化了邏輯。

我們來看代碼

public String reverseWords(String s) {// 第一步:調用removeSpace去除多余空格StringBuilder sb = removeSpace(s);// 第二步:反轉整個字符串reverseString(sb, 0, sb.length() - 1);// 第三步:反轉每個單詞reverseEachWord(sb);// 返回最終結果return sb.toString();
}
private StringBuilder removeSpace(String s) {// 定義雙指針,用于確定字符串的有效范圍(去除首尾空格)int start = 0;int end = s.length() - 1;// 移動start指針,跳過開頭的空格while (s.charAt(start) == ' ') start++;// 移動end指針,跳過結尾的空格while (s.charAt(end) == ' ') end--;// 創建StringBuilder存儲結果StringBuilder sb = new StringBuilder();// 處理中間的空格,確保單詞之間只有一個空格while (start <= end) {char c = s.charAt(start);// 當前字符不是空格,或者當前字符是空格但前一個字符不是空格時,才添加if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {sb.append(c);}start++;}return sb;
}
public void reverseString(StringBuilder sb, int start, int end) {// 使用雙指針從兩端向中間移動while (start < end) {// 交換start和end位置的字符char temp = sb.charAt(start);sb.setCharAt(start, sb.charAt(end));sb.setCharAt(end, temp);// 移動指針start++;end--;}
}
private void reverseEachWord(StringBuilder sb) {// start指向單詞的開始,end指向下一個字符int start = 0;int end = 1;int n = sb.length();while (start < n) {// 移動end直到找到單詞的結束位置(空格或字符串末尾)while (end < n && sb.charAt(end) != ' ') {end++;}// 反轉當前單詞reverseString(sb, start, end - 1);// 更新start和end,準備處理下一個單詞start = end + 1;end = start + 1;}
}

卡碼網:55.右旋轉字符串

建議:題解中的解法如果沒接觸過的話,應該會想不到

題目鏈接/文章講解:

右旋轉

?我們思路和之前一樣,先整體反轉,然后反轉前n個字符,再反轉剩余字符,為什么這樣做呢,因為可以

1. 空間復雜度O(1):只需要在原數組上操作
2. 實現簡單:只需要基本的反轉操作
3. 適用性強:對任意長度的字符串和任意的n值都適用
4. 不需要考慮字符移動和臨時存儲的復雜問題

我們來看代碼:

public static void main(String[] args) {// 讀取輸入Scanner in = new Scanner(System.in);// 讀取n值,表示第一部分的長度int n = Integer.parseInt(in.nextLine());// 讀取待處理的字符串String s = in.nextLine();int len = s.length();// 將字符串轉換為字符數組,方便操作char[] chars = s.toCharArray();// 三步反轉法reverseString(chars, 0, len - 1);     // 步驟1:整體反轉reverseString(chars, 0, n - 1);       // 步驟2:反轉前n個字符reverseString(chars, n, len - 1);     // 步驟3:反轉剩余字符// 輸出結果System.out.println(chars);
}

public static void reverseString(char[] ch, int start, int end) {// 使用異或運算進行字符交換while (start < end) {// 三步異或操作實現兩個字符的交換ch[start] ^= ch[end];    // a = a^bch[end] ^= ch[start];    // b = b^(a^b) = ach[start] ^= ch[end];    // a = (a^b)^a = bstart++;end--;}
}

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

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

相關文章

【計算機網絡】計算機網絡的性能指標——時延、時延帶寬積、往返時延、信道利用率

計算機網絡的性能指標 導讀 大家好&#xff0c;很高興又和大家見面啦&#xff01;&#xff01;&#xff01; 在上一篇內容中我們介紹了計算機網絡的三個性能指標——速率、帶寬和吞吐量。用大白話來說就是&#xff1a;網速、最高網速和實時網速。 相信大家看到這三個詞應該就…

Refreshtoken 前端 安全 前端安全方面

網絡安全 前端不需要過硬的網絡安全方面的知識,但是能夠了解大多數的網絡安全,并且可以進行簡單的防御前兩三個是需要的 介紹一下常見的安全問題,解決方式,和小的Demo,希望大家喜歡 網絡安全匯總 XSSCSRF點擊劫持SQL注入OS注入請求劫持DDOS 在我看來,前端可以了解并且防御前…

vue3框架的響應式依賴追蹤機制

當存在一個響應式變量于視圖中發生改變時會更新當前組件的所以視圖顯示&#xff0c;但是沒有視圖中不寫這個響應式變量就就算修改該變量也不會修改視圖&#xff0c;這是為什么&#xff1f;我們能否可以理解寬泛的理解為vue組件的更新就是視圖的更新&#xff0c;單當視圖中不存在…

C#核心(22)string

前言 我們在之前的學習中已經學習過了很多數字類型的數據結構,但一直沒有講解除了char以外的字符串相關的知識點,這也是我們繼繼承,封裝,重載這些知識點之后要補充講解的核心知識點。 你也發現了,其實在密封函數之后我們就已經開始進入更底層的方面為你講解知識點了,這…

Spring Boot 本地緩存工具類設計與實現

在 Spring Boot 應用中&#xff0c;緩存是提升性能的重要手段之一。為了更方便地使用緩存&#xff0c;我們可以設計一套通用的本地緩存工具類&#xff0c;封裝常見的緩存操作&#xff0c;簡化開發流程。本文將詳細介紹如何設計并實現一套 Spring Boot 本地緩存工具類&#xff0…

引領變革!北京愛悅詩科技有限公司榮獲“GAS消費電子科創獎-產品創新獎”!

在2025年“GAS消費電子科創獎”評選中&#xff0c;北京愛悅詩科技有限公司提交的“aigo愛國者GS06”&#xff0c;在技術創新性、設計創新性、工藝創新性、智能化創新性及原創性五大維度均獲得評委的高度認可&#xff0c;榮獲“產品創新獎”。 這一獎項不僅是對愛悅詩在消費電子…

考研英語語法全攻略:從基礎到長難句剖析?

引言 在考研英語的備考之旅中,語法猶如一座燈塔,為我們在浩瀚的英語知識海洋中指引方向。無論是閱讀理解中復雜長難句的解讀,還是寫作時準確流暢表達的需求,扎實的語法基礎都起著至關重要的作用。本文將結合有道考研語法基礎入門課的相關內容,為大家全面梳理考研英語語法…

構建自己的AI客服【根據用戶輸入生成EL表達式】

要實現一個基于對話形式的AI客服系統&#xff0c;該系統能夠提示用戶輸入必要的信息&#xff0c;并根據用戶的輸入生成相應的EL&#xff08;Expression Language&#xff09;表達式編排規則&#xff0c;您可以按照以下步驟進行設計和開發。本文將涵蓋系統架構設計、關鍵技術選型…

【JavaWeb12】數據交換與異步請求:JSON與Ajax的絕妙搭配是否塑造了Web的交互革命?

文章目錄 &#x1f30d;一. 數據交換--JSON??1. JSON介紹??2. JSON 快速入門??3. JSON 對象和字符串對象轉換??4. JSON 在 java 中使用??5. 代碼演示 &#x1f30d;二. 異步請求--Ajax??1. 基本介紹??2. JavaScript 原生 Ajax 請求??3. JQuery 的 Ajax 請求 &a…

解決CentOS 8.5被惡意掃描的問題

CentOS 8 官方倉庫已停止維護(EOL),導致一些常用依賴包如fail2ban 無法正常安裝。 完整解決方案: 一、問題根源 CentOS 8 官方倉庫已停更:2021 年底 CentOS 8 停止維護,默認倉庫的包可能無法滿足依賴關系。EPEL 倉庫兼容性:EPEL 倉庫可能未適配 CentOS 8.5 的舊版本依賴…

使用格式工廠提取視頻中的音頻

選擇輸出格式&#xff1a;在格式工廠的左側功能欄中&#xff0c;點擊 “音頻” 選項&#xff0c;會展開多種音頻格式&#xff0c;根據自己的需求選擇如 “MP3”“WAV”“WMA” 等作為輸出格式。添加視頻文件&#xff1a;點擊 “添加文件” 按鈕&#xff0c;在彈出的文件瀏覽器中…

前端雜的學習筆記

什么是nginx Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器 Nginx是一款輕量級的Web 服務器/反向代理服務器&#xff0c;處理高并發能力是十分強大的&#xff0c;并且支持熱部署&#xff0c;啟動簡單&#xff0c;可以做到7*24不間斷運行 正代和反代 學習nginx&a…

玩轉ChatGPT:GPT 深入研究功能

一、寫在前面 民間總結&#xff1a; 理科看Claude 3.7 Sonnet 文科看DeepSeek-R1 那么&#xff0c;ChatGPT呢&#xff1f; 看Deep Research&#xff08;深入研究&#xff09;功能。 對于科研狗來說&#xff0c;在這個文章爆炸的時代&#xff0c;如何利用AI準確、高效地收…

RabbitMQ 2025/3/5

高性能異步通信組件。 同步調用 以支付為例&#xff1a; 可見容易發生雪崩。 異步調用 以支付為例&#xff1a; 支付服務當甩手掌柜了&#xff0c;不管后面的幾個服務的結果。只管庫庫發&#xff0c;后面那幾個服務想取的時候就取&#xff0c;因為消息代理里可以一直裝&#x…

Win10 訪問 Ubuntu 18 硬盤

目錄 方案一&#xff1a;使用Samba共享服務Ubuntu 18 端配置Windows 10 端訪問 方案二&#xff1a;使用 SSHFS&#xff08;需在 Windows 上安裝 SSH 客戶端&#xff09;Ubuntu 18 端配置Windows 10 端配置 方案三&#xff1a;使用 FTP 服務Ubuntu 18 端配置Windows 10 端訪問 方…

Android15使用FFmpeg解碼并播放MP4視頻完整示例

效果: 1.編譯FFmpeg庫: 下載FFmpeg-kit的源碼并編譯生成安裝平臺庫 2.復制生成的FFmpeg庫so文件與包含目錄到自己的Android下 如果沒有prebuiltLibs目錄,創建一個,然后復制 包含目錄只復制arm64-v8a下

Hadoop、Hive、Spark的關系

Part1&#xff1a;Hadoop、Hive、Spark關系概覽 1、MapReduce on Hadoop 和spark都是數據計算框架&#xff0c;一般認為spark的速度比MR快2-3倍。 2、mapreduce是數據計算的過程&#xff0c;map將一個任務分成多個小任務&#xff0c;reduce的部分將結果匯總之后返回。 3、HIv…

計算機網絡篇:基礎知識總結與基于長期主義的內容更新

基礎知識總結 和 MySQL 類似&#xff0c;我同樣花了一周左右的時間根據 csview 對計算機網絡部分的八股文進行了整理&#xff0c;主要的內容包括&#xff1a;概述、TCP 與 UDP、IP、HTTP&#xff0c;其中我個人認為最重要的是 TCP 這部分的內容。 在此做一篇目錄索引&#xf…

[密碼學實戰]Java實現國密TLSv1.3單向認證

一、代碼運行結果 1.1 運行環境 1.2 運行結果 1.3 項目架構 二、TLS 協議基礎與國密背景 2.1 TLS 協議的核心作用 TLS(Transport Layer Security) 是保障網絡通信安全的加密協議,位于 TCP/IP 協議棧的應用層和傳輸層之間,提供: ? 數據機密性:通過對稱加密算法(如 AE…

09 HarmonyOS NEXT 仿uv-ui Tag組件開發教程系列(三)

溫馨提示&#xff1a;本篇博客的詳細代碼已發布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下載運行哦&#xff01; 文章目錄 Tag組件實戰應用與最佳實踐1. 復雜場景應用1.1 標簽篩選系統 2. 性能優化實踐2.1 狀態管理優化2.2 渲染性能優化 3. 實用功能擴展3.1 拖拽…