?344.反轉字符串
題目鏈接 | 文檔講解 |視頻講解 :?鏈接
?1.思路:
-
采用雙指針,left從0開始移動,right從尾元素進行移動
-
循環判斷條件:left< right,邊界值使用舉例法,eg: [?h ,e ,l,o ]偶數個不會相遇, [h ,e ,l ,l ,o ]奇數個,指向同一個,交換無意義
-
交換左右節點的值
?2.代碼:
public void reverseString(char[] s) {int left =0;int right=s.length-1;while (left<right){char temp=s[left];s[left]=s[right];s[right]=temp;left++;right--;}}
541. 反轉字符串II
題目鏈接 | 文檔講解 |視頻講解:鏈接
?1.思路:
-
雙指針 字符串先轉成char數組
-
首先是每計數到2k,就要反轉操作,那么我們可以讓for循環每次都i+2*k,直到i>length
-
start=i,end的取值,取得是Math.min(charArray.length-1,start+k-1),當剩余字符<k時,反轉[start,charArray.length-1] 當剩余元素>=k時,反轉的是[start,start+k-1]
【誤區】"a b c d e" k=3??
? ? 一開始我認為i=0,進入循環,反轉了abc,剩余元素時de,剩余元素<k,需要反轉,但是現在邏輯是沒有進行反轉。
? ? 誤區:剩余元素時相對于當前元素往后計算[start+1,length-1],而不是反轉后剩余的元素。對于當前字符串i=0,剩余元素的個數是5, k<5<2*k,所以反轉的是前k,即反轉abc,de是不反轉的。
【注】
? ?剩余元素時相當于當前的起始元素來說
? 當需要固定規律一段一段去處理字符串的時候,要想想在for循環的表達式上做做文章
?2.代碼:
public String reverseStr(String s, int k) {char[] charArray = s.toCharArray();//1.每計數到2k時,反轉前k,所以i每次變化是i+2*kfor (int i = 0; i < charArray.length; i+=2*k) {//2.首元素取值為iint start=i;//3/尾元素取值//當剩余元素(從start元素開始往后算)>=k,反轉[start,start+k-1]//當剩余元素<k,反轉[start,charArray.length-1]int end=Math.min(charArray.length-1,start+k-1);//4.反轉[start.end]字符串while (start < end) {char temp=charArray[start];charArray[start]=charArray[end];charArray[end]=temp;start++;end--;}}return new String(charArray);}
卡碼網:54.替換數字
題目鏈接 | 文檔講解 |視頻講解:
1.思路:
-
? ? ?字符串轉成char數組,遍歷char數組,使用StringBuilder str
-
? ? ?判斷當前元素是否是數字,是數字,str拼接number,否則拼接原始字符
-
? ? ?StringBuilder str轉成字符串
?2.代碼:
public String replace(String s){char[] charArray = s.toCharArray();StringBuilder str=new StringBuilder();for (char c : charArray) {//判斷字符是否是數組if(Character.isDigit(c)){str.append("number");}else{str.append(c);}// if(c>='0' && c<='9'){
// str.append("number");
// }else{
// str.append(c);
// }// if(String.valueOf(c).matches("\\d")){
// str.append("number");
// }else{
// str.append(c);
// }}return new String(str);}
【注】學會如何判斷字符是否是數字: 1.Character.isDigit(ch)? 2.正則? ch>='0'&& ch<='9'
3.正則表達式 String.valueOf(ch).matches("\\d")