代碼隨想錄算法訓練營Day8|541. 反轉字符串II、替換數字、151.翻轉字符串里的單詞、卡碼網:55.右旋轉字符串

541. 反轉字符串II

1.這道題剛開始把題意理解錯了,以為對于任意長度的字符串都只反轉[0,k-1]以及[2k,3k-1]區間的值。
2.但實際上是要把一個字符串分成若干長度為2k的小區間,反轉前[0,k-1]的字符串,[k,2k-1]保持不變;
3.如果有一個區間字符串字符個數小于k,則全部反轉。
4.雙指針法實現反轉比用索引更方便

class Solution {public String reverseStr(String s, int k) {StringBuilder res = new StringBuilder(s);for(int i=0;i<=s.length()-1;i+=2*k){//每2k長度的區間操作一次if(s.length() >= i+k) reverse(res,i,i+k-1);//如果s字符串長度大于等于i+k,[i,i+k-1]區間反轉,[i+k,i+2k-1]不變else reverse(res,i,s.length()-1);//如果s字符串長度小于i+k,在[i,s.length()-1]區間上全部反轉}return  res.toString();}public StringBuilder reverse(StringBuilder s,int startIndex,int endIndex){//雙指針法實現反轉比用索引更方便int left = startIndex;int right = endIndex;while(left<right){char temp = s.charAt(left);s.setCharAt(left,s.charAt(right));s.setCharAt(right,temp);left++;right--;}return s;}
}

import java.util.*;
class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String target = scanner.nextLine();
System.out.print(method(target));
}
public static String method(String str){
StringBuilder sb = new StringBuilder();
for(int i=0;i<str.length();i++){
if(Character.isDigit(str.charAt(i))) sb.append(“number”);
else sb.append(str.charAt(i));
}
return sb.toString();
}
}

替換數字

這道題是ACM格式的,趁這個機會練習一下。要注意以下幾點:
1.類名必須為Main,同時要有主函數。
2.要有輸入輸出,輸出要打印
3.需要自己導入必要的包

補充知識點:
Character.isDigit()判斷字符是否為數字

import java.util.*;
class Main{public static void main(String[] args){Scanner scanner = new Scanner(System.in);String target = scanner.nextLine();System.out.print(method(target));}public static String method(String str){StringBuilder sb = new StringBuilder();for(int i=0;i<str.length();i++){if(Character.isDigit(str.charAt(i))) sb.append("number");else sb.append(str.charAt(i));}return sb.toString();}
}

151.翻轉字符串里的單詞

方法一:自己想的方法,思路比較簡單,但是調試了好久,貼在這里梳理一下思路。

class Solution {public String reverseWords(String s) {ArrayList<StringBuilder> list = new ArrayList<StringBuilder>();//存儲遍歷出來的一個個的無空格的單詞StringBuilder sb = new StringBuilder(s);//先將String轉為StringBuilder類型,便于操作StringBuilder res = new StringBuilder();//存儲最終返回的結果int i = 0;//初始化指針while(sb.charAt(i) == ' ') i++;//將指針移動到有單詞的位置上while(i < s.length()){//遍歷sStringBuilder sbOne = new StringBuilder();//存儲一個單詞的StringBuilderwhile(s.charAt(i) != ' '){//不是空格的時候sbOne.append(s.charAt(i));//字符持續加入sbOne,直到遇到空格i++;if(i >= s.length()) break;//大于等于s.length(),也結束循環}list.add(sbOne);//此時指針i在空格上或者在最后一個字符的下一位,先保存sbOneif(i >= s.length()) break;//如果在最后一個字符的下一位,直接結束循環while(s.charAt(i) == ' '){//如果是空格就持續向下移動,直到遇到單詞i++;if(i >= s.length()) break;//大于等于s.length(),也結束循環}}//此時list已經按序存儲了所有滿足條件的單詞for(int j=list.size()-1;j >= 1;j--){res.append(list.get(j) + " ");}//除了第一個單詞,其他都是一個單詞一個空格地加入resres.append(list.get(0));//第一個單詞直接加入,沒有空格return res.toString();}
}

方法二:
卡哥的方法,先整體反轉,再去除多余的空格,最后再對每一個單詞反轉。卡哥要求空間復雜度為O(1),那方法一就不符合要求了。

class Solution {public String reverseWords(String s) {int length = s.length();StringBuilder sb = new StringBuilder(s);reverse(sb,0,length-1);removeExtraSpace(sb);reverseOneWord(sb);return sb.toString();}public static void reverse(StringBuilder s,int startIndex,int endIndex){//雙指針法實現反轉int left = startIndex;int right = endIndex;while(left < right){char temp = s.charAt(left);s.setCharAt(left,s.charAt(right));s.setCharAt(right,temp);left++;right--;}}public static void reverseOneWord(StringBuilder s){//單個單詞反轉,對于除最后一個單詞之外的單詞//快指針下一個為空說明此時fast處于單詞尾部,[slow,fast]之間的字符反轉//slow變為fast+2,因為要跳過空格//最后一個單詞直接[slow,s.length()-1]反轉int slow = 0;for(int fast = 0;fast < s.length()-1;fast++){if(s.charAt(fast+1) != ' ') continue;else{reverse(s,slow,fast);slow = fast+2;}}reverse(s,slow,s.length()-1);}public static void removeExtraSpace(StringBuilder s){int slow = 0;boolean need=false;for(int fast = 0; fast < s.length();fast++){if(s.charAt(fast) != ' '){s.setCharAt(slow++,s.charAt(fast));//當快指針遇到了單詞的第一個字母,說明slow指針放置完這個單詞之后還要再放一個' 'need = true;}else if(need){//當遇到了空格(一個單詞遍歷結束)并且need為true,將slow指針指向的位置置為' 's.setCharAt(slow++,' ');   need = false;}}//但是如果原始字符串本身以空格結尾,倒數第一個單詞遍歷完之后need還是true的,因此新字符串還會添一個' ',這個時候應該長度置為slow-1if(s.charAt(s.length()-1) == ' ') s.setLength(slow-1);//如果原始字符串本身不以空格結尾,新字符串不會添' ',直接s.setLength(slow);else s.setLength(slow);}
}

方法三:
之前寫的一個方法,用字符數組做的,時間復雜度和空間復雜度都很低。
這里的反轉單個單詞的方法非常棒:

    public void keyReverse(char[] chars){//start索引是隨著end索引移動而移動的int start = 0;//這里end <= chars.length,end最大可以到chars.length,對應的是reverse(chars,start,end-1);for(int end = 0;end <= chars.length;end++){if(end == chars.length || chars[end] == ' '){reverse(chars,start,end-1);start = end+1;}}}
class Solution {public String reverseWords(String s) {char[] chars = s.toCharArray();char[] charsNew = trim(chars,chars.length);reverse(charsNew,0,charsNew.length-1);keyReverse(charsNew);return String.valueOf(charsNew);}public void keyReverse(char[] chars){//start索引是隨著end索引移動而移動的int start = 0;//這里end <= chars.length,end最大可以到chars.length,對應的是reverse(chars,start,end-1);for(int end = 0;end <= chars.length;end++){if(end == chars.length || chars[end] == ' '){reverse(chars,start,end-1);start = end+1;}}}//該方法用于反轉指定索引的字符串public void reverse(char[] chars,int start,int end){while(start < end){char temp = chars[start];chars[start] = chars[end];chars[end] = temp;start++;end--;}}public char[] trim(char[] chars,int length){//該方法用于去除字符串兩頭的空格以及單詞之間多余的空格int slow = 0;for(int fast = 0;fast< length;fast++){if(chars[fast] != ' '){//遇到非空說明slow后面要加空格了if(slow != 0) chars[slow++] = ' ';//直到找到下一個單詞首字母(非空)while(fast < chars.length && chars[fast] != ' '){chars[slow++] = chars[fast++];}}}//創建一個用于存儲信數組的newChars,可以將多余部分去除char[] newChars = new char[slow];//chars為復制源,起始索引,目標數組,起始索引,要復制的元素數量System.arraycopy(chars, 0, newChars, 0, slow); return newChars;}
}

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

這道題目很簡單,但是解決了我長久以來關于ACM模式的一個困惑:連續用scanner向系統鍵入兩個量的時候,會報錯。
因為:如下面代碼所示, int num = scanner.nextInt();輸入一個整數之后還要鍵入一個回車,這個回車會被當成緊接著要輸入的scanner.nextLine();導致在執行下面代碼中出錯。因此需要鍵入一個scanner.nextLine();消耗掉回車。
scanner.nextLine(); // 消耗掉nextInt后的換行符

import java.util.*;
class Main{public static void main(String[] args){Scanner scanner = new Scanner(System.in);int num = scanner.nextInt();scanner.nextLine();//消耗掉回車String str = scanner.nextLine();int len = str.length();StringBuilder sb = new StringBuilder();for(int i = len-num;i < len;i++){sb.append(str.charAt(i));}for(int i = 0;i<len-num;i++){sb.append(str.charAt(i));}System.out.print(sb.toString());}
}

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

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

相關文章

2024年東北師范CCPC

文章目錄 A.Paper WateringB.nIM gAMEE.Checksum A.Paper Watering 思路&#xff1a;題目說有平方和開方兩種操作&#xff0c;如果這個數是平方數&#xff0c;那么它開方之后就只能開方&#xff0c;如果平方的話就重復了&#xff0c;反之就有開方和平方兩種操作。 代碼如下 //…

為了方便看公眾號文章,我搭建了個博客,在線看公眾號所有歷史文章,想看哪天的文章一秒就能找到

公眾號沒有個網頁版的文章列表&#xff0c;只能在電腦和手機客戶端看&#xff0c;想看之前的歷史文章只能一直往下拉&#xff0c;想找某篇文章非常費勁。 為了方便看公眾號文章&#xff0c;我搭建了個博客&#xff0c;博客地址https://sushengbuhuo.github.io/blog &#xf…

通過 SFP 接口實現千兆光纖以太網通信1

基于米聯客ARTIX-7 系列開發板及其開發手冊。 總體實現框圖如下&#xff1a; SFP 接口 SFP 信號定義如下圖所示。 Tri Mode Ethernet MAC 設置 由于使用千兆通訊&#xff0c;因此將速率設為 1Gbps。如下圖所示。 首先&#xff0c;由于該 IP 需要與 IP 核 1G/2.5G Ethernet …

基于IoTDB 平臺的學習和研究

Apache IoTDB&#xff08;物聯網數據庫&#xff09;是一個針對物聯網領域的高性能原生數據庫&#xff0c;適用于數據管理和分析&#xff0c;并可在邊緣計算和云端部署。由于它輕量級的架構、高性能和豐富的功能集&#xff0c;以及與Apache Hadoop、Spark和Flink的深度集成&…

【面試】生成class文件的編譯器有哪些?

目錄 1. 說明2. javac3. IDE(集成開發環境)中的編譯器3.1 Eclipse編譯器3.2 IntelliJ IDEA編譯器 1. 說明 1.javac和IDE中的編譯器是最常用的和主要的。2.這些編譯器都能夠將Java源代碼編譯為可在JVM上執行的字節碼文件&#xff0c;是實現Java跨平臺特性的關鍵。3.選擇編譯器時…

數據管理知識體系必知的14張語境關系圖

近期對數據管理知識體系中的語境關系圖進行了整體學習梳理,總共有14張圖,具體如下,供大家參考。應該說語境關系圖和環境因素六邊形圖是各有側重、互為補充關系。語境關系圖是環境因素六邊形圖的細化,描述了每個知識領域中的細節,相當于數據管理的微觀視角, 包括與人員、 …

kali中切換python版本

kali中切換python版本 在日常使用的過程中&#xff0c;可以通過一些工具來做打靶環境&#xff0c;或者工具的啟動&#xff0c;都和python關聯&#xff0c;而有時存在工具安裝&#xff0c;或者運行的時候出現報錯&#xff0c;這時候極大可能是因為我們本地的kali中python的版本不…

Android Studio | 小白如何運行別人的安卓項目

目錄 Step1&#xff1a;正確地打開項目 Step2&#xff1a;AS 同步時報錯 Step3&#xff1a;同步完成后啟動 Step4&#xff1a;啟動成功 說明&#xff1a;本文簡稱 Android Studio 為 AS Step1&#xff1a;正確地打開項目 重點&#xff1a;確認好項目的根目錄是哪個目錄&am…

進程與線程(三)

進程與線程&#xff08;三&#xff09; 進程間通信傳統間的進程間通信機制無名管道無名管道的特征無名管道的創建父子進程通信測試管道的大小管道讀寫易出現的問題 有名管道創建有名管道有名管道的寫端代碼有名管道的讀端代碼 信號信號的特征產生信號硬件來源軟件來源發送信號的…

Linux chmod 命令

Linux chmod 命令 在 Linux 操作系統中&#xff0c;chmod 命令是非常重要的。它可以用于修改文件和目錄的訪問權限&#xff0c;以及控制用戶對系統資源的訪問。在這篇博客中&#xff0c;我們將深入探討 chmod 命令的使用方法&#xff0c;以及如何使用它來管理文件和目錄的訪問…

什么是主碼,什么是候選碼,主碼的候選碼的區別是什么

目錄 一、候選碼 (Candidate Key) 1.定義 2.特點 二、主碼 (Primary Key) 1.定義 2.特點 三、關系和區別 1.關系 2.區別 一、候選碼 (Candidate Key) 1.定義 候選碼是能夠唯一標識數據庫表中每一條記錄的屬性集合。一個表可以有一個或多個候選碼。 2.特點 每個候選…

【U-Boot 源碼深度解析】000 - 文章鏈接匯總

【U-Boot 源碼深度解析】000 - 文章鏈接匯總 下載鏈接 https://ftp.denx.de/pub/u-boot/ 《【U-Boot 源碼深度解析】001 - Ubuntu 24.04 虛擬機 及 基礎環境搭建》

ORACLE RAC的一些基本理論知識

一 . Oracle RAC 的發展歷程 1. Oracle Parallel Server (OPS) 早期階段&#xff1a;Oracle 6 和 7 Oracle Parallel Server&#xff08;OPS&#xff09;是 Oracle RAC 的前身。 通過多個實例并行訪問同一個數據庫來提高性能。 共享磁盤架構&#xff0c;利用分布式鎖管理&am…

JZ2440筆記:Nor FLASH驅動程序

(1)測試原有的驅動&#xff1a; make menuconfig修改physmap-flash驅動配置&#xff1a;起始0&#xff0c;大小0x100000&#xff0c;位寬2&#xff0c;make modules后拷貝過去測試&#xff1a; # insmod physmap.ko physmap platform flash device: 01000000 at 00000000 phy…

C#面:解釋什么是viewstate,能否禁用?是否所用控件都可以禁用

在C#中&#xff0c;ViewState是 ASP.NET Web Forms中的一個重要概念。它用于在Web應用程序中跨頁面請求之間保存和恢復頁面的狀態數據。ViewState的主要目的是在頁面回發&#xff08;postback&#xff09;期間保持頁面上的控件狀態&#xff0c;以便在頁面重新加載后能夠正確地還…

addEventListener()方法中的幾個參數,以及作用

addEventListener() 方法是 JavaScript 中用于處理指定元素的指定事件的函數。它有三個參數&#xff1a; type&#xff08;必需&#xff09;&#xff1a;一個字符串&#xff0c;指定要監聽的事件名。 listener&#xff08;必需&#xff09;&#xff1a;一個實現了 EventListen…

【第1章】SpringBoot實戰篇之注冊接口

文章目錄 前言一、代碼部分1. User2.UserMapper13. UserSerivce4. UserController15. Result 二、測試1.注冊2.再次注冊 總結 前言 下面介紹用戶注冊接口。 一、代碼部分 1. User package org.example.springboot3.bigevent.entity;import com.baomidou.mybatisplus.annotat…

開發板uboot與virtualbox虛擬機、windows11網絡互通

環境&#xff1a;virtualbox中ubuntu22.04.4&#xff0c;開發板通過網線再經過拓展塢usb網卡跟windows11連接。連接如下&#xff1a; 1、關閉windows防火墻(重要) 2、先在VirtualBox的工具選項創建兩個網絡【僅主機(Host-Only)網絡】和【NAT網絡】 僅主機(Host-Only)網絡的ip:…

Linux下Qt Creator無法輸入中文(已解決)

1. 首先確保安裝了搜狗輸入法&#xff0c;且能正常運行。 2.克隆源碼到本地。 git clone https://gitcode.com/fcitx/fcitx-qt5.git 3.檢查Qt Creator版本&#xff0c;如下圖所示&#xff0c;為基于Qt6的。 4. 進入源碼目錄&#xff0c;建立build文件夾&#xff0c;修改CMak…

并發任務的進化之旅

An evolutionary journey of multitasking 多重任務的進化之旅 In the beginning, computers had one CPU that executed a set of instructions written by a programmer one by one. No operating system (OS), no scheduling, no threads, no multitasking. This was how …