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")