文章目錄
- 反轉字符串
- 反轉字符串II
- 替換數字
反轉字符串
題目鏈接:344. 反轉字符串
雙指針法,兩個指針的元素直接調轉即可
class Solution {public void reverseString(char[] s) {int head = 0;int end = s.length - 1;while(head < end) {char temp = s[head];s[head++] = s[end];s[end--] = temp;}}
}
反轉字符串II
題目鏈接:541. 反轉字符串 II
雙指針法代碼邏輯:
- 初始化head、end雙指針,兩指針相距2k,作為操作區間
- 在操作區間中反轉前k個字符
- 移動指針,head移到end,end往后移2k,繼續上述操作
- 直到end指針超出界限
- 此時將多余部分分情況反轉
- 少于k全部反轉
- 大于k,反轉前k個
代碼如下:
class Solution {public String reverseStr(String s, int k) {int head = 0;int end = head + 2 * k;char[] charArray = s.toCharArray();while(end < s.length()) {reverseString(charArray,head,head + k - 1);head = end;end += 2 * k; }int rest = s.length() - head;if(rest >= k) {reverseString(charArray,head,head + k - 1);} else {reverseString(charArray,head,s.length() -1);}return new String(charArray);}public void reverseString(char[] s,int start,int end) {while(start < end) {char temp = s[start];s[start++] = s[end];s[end--] = temp;}}
}
替換數字
題目鏈接:54. 替換數字
解題邏輯直接遍歷使用StringBuilder拼接即可:
import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine(); // 讀取一整行字符串Set<Character> nums = new HashSet<>(Arrays.asList('1','2','3','4','5','6','7','8','9','0'));StringBuilder result = new StringBuilder();for(int i = 0;i < input.length();i++) {if (nums.contains(input.charAt(i))) result.append("number");else result.append(input.charAt(i));}System.out.println(result);scanner.close();}
}
當然這么寫就繞過了此題的精髓。
這道題想要體現的點在于:很多數組填充類的問題,其做法都是先預先給數組擴容帶填充后的大小,然后在從后向前進行操作。
字符串的本質就是char型數組,所以這個方法當然可以沿用,其好處在于:
- 避免數據覆蓋:如果從前往后填充,在填充過程中可能會覆蓋尚未處理的數據。而從后向前填充,可以確保在填充新元素時,不會影響到前面尚未處理的元素,從而保證了數據的完整性和正確性。
- 提高效率:從后向前操作可以減少元素的移動次數。在數組擴容后,若從前往后填充,每插入一個新元素,后面的元素都需要向后移動一位,時間復雜度較高。而從后向前填充,只需將新元素直接放置在合適的位置,無需頻繁移動其他元素,提高了填充操作的效率。
代碼如下:
import java.util.Scanner;public class Main {public static String replaceNumber(String s) {int count = 0; // 統計數字的個數int sOldSize = s.length();for (int i = 0; i < s.length(); i++) {if(Character.isDigit(s.charAt(i))){count++;}}// 擴充字符串s的大小,也就是每個空格替換成"number"之后的大小char[] newS = new char[s.length() + count * 5];int sNewSize = newS.length;// 將舊字符串的內容填入新數組System.arraycopy(s.toCharArray(), 0, newS, 0, sOldSize);// 從后先前將空格替換為"number"for (int i = sNewSize - 1, j = sOldSize - 1; j < i; j--, i--) {if (!Character.isDigit(newS[j])) {newS[i] = newS[j];} else {newS[i] = 'r';newS[i - 1] = 'e';newS[i - 2] = 'b';newS[i - 3] = 'm';newS[i - 4] = 'u';newS[i - 5] = 'n';i -= 5;}}return new String(newS);};public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String s = scanner.next();System.out.println(replaceNumber(s));scanner.close();}
}