344.反转字符串
这道题一开始我还是用的老办法,什么第i个和第n-i个交换啊。但是做完以后发现这也太low了,突然就想到用双指针,并且做出来了,感觉自己确实成长了。继续坚持吧。
class Solution {
public void reverseString(char[] s) {
int l =0;
int r = s.length-1;
while(l<r){
char temp = s[l];
s[l] = s[r];
s[r] = temp;
l++;
r--;
}
for(char c :s){
System.out.print(c);
}
}
}
541. 反转字符串II
int i = l;这一步很重要,你如果直接在for循环里面定义左指针l,那么你下面的while循环当中的l++会改变你的l,所以一定要分开定义,for里面是i;用于提供给l起点,还有就是对于最后几个小于2k元素的处理,你就直接判断,l+k-1大还是length-1大,如果l+k-1大,说明最后几个已经小于k了,可以直接全部反转了,如果length-1大,那么就说明最后几个大于k个,对前k个反转就行。
而且for(int i = 0;i<s.length();i+=2*k)这一步的2k也需要注意,不要想当然的i++;
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i = 0;i<s.length();i+=2*k){
int l = i;//这步很重要
int r = l+k-1>s.length()-1?s.length()-1:l+k-1;
while(l<r){
char temp = ch[l];
ch[l] = ch[r];
ch[r] = temp;
l++;
r--;
}
}
return new String(ch);
}
}
卡码网:54.替换数字
这道题我不知道怎么判断字符是否是数字,忘了。
151.翻转字符串里的单词
(这道题我理解了很久,5月15日到17日之间还是有些堕落。加油吧!)
总体思路是先把多余的空格处理好,然后总体反转,最后每个单词独立反转。
处理空格是先把所有的空格去掉,然后自己手动添加空格,和移除数组元素很像,都需要首先定义快指针和慢指针。
有几点需要注意:
1、reverse的函数要定义左右边界范围,这样可以重复利用
2、每个单词独立反转这块好好看,if内谁先判断谁后判断是有说法的,
3、移除空格这一部分,你一开始的数组长度和你处理完以后的数组长度并不是一样的,你一定要确定好新数组的范围,而且要定死。
slow的大小即为去除多余空格后的大小。
class Solution {
public static String reverseWords(String s) {
char[] ch = s.toCharArray();//
ch = removeExtraSpaces(ch);
System.out.println(ch);
reverse(ch,0,ch.length-1);
int start = 0;
for(int i = 0;i<=ch.length;i++){
if(i == ch.length||ch[i]==' '){//这一部分谁在前谁在后太细了
reverse(ch,start,i-1);
start = i+1;
}
}
return new String(ch);
}
public static char[] removeExtraSpaces(char[] ch){
int slow = 0;
for(int i = 0 ; i<ch.length;i++){
if(ch[i]!=' '){
if(slow!=0){
ch[slow++] = ' ';//加空格
}
while(i<ch.length&&ch[i]!=' '){
ch[slow++] = ch[i++];
}
}
}
char[] newChars = new char[slow];//这几步其实很重要,这决定了你去除空格以后数组的长度。slow的大小即为去除多余空格后的大小。
System.arraycopy(ch, 0, newChars, 0, slow);
return newChars;
}
public static void reverse(char[] ch, int left, int right){
for(int i=left,j=right;i<j;i++,j--){
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
}
}
}
● 卡码网:55.右旋转字符串
Integer.parseInt(sc.nextLine());Java --- Integer.parseInt()-CSDN博客
主要是确定好reverse的边界,起始下标和终止下标;
import java.util.Scanner;
public class Main{
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());//这行代码没见过
String s = sc.nextLine();
char[] chars = s.toCharArray();
reverse(chars,0,chars.length-1);
reverse(chars,0,n-1);
reverse(chars,n,chars.length-1);
System.out.println(chars);
}
public static void reverse(char[] chars,int start ,int end){
for(;start<end;start++,end--){
char tmp = chars[start];
chars[start] = chars[end];
chars[end] = tmp;
}
}
}