Java中有很多对字符串封装的操作,本次解题中不调用方法。
1.力扣344
利用双指针即可解决反转链表,定义一个left指针指向0,right指向nums.length-1,交换后向中间移动,直至left>=right结束
解题步骤:
- 定义两个指针,left和right,分别初始化为0和nums.length-1
- nums【left】和nums【right】交换值,并让左右指针分别向中间移动一步
- 重复循环,直至left>=right
代码如下:
public void reverseString(char[] s) {
int left = 0;
int right =s.length-1;
char temp;
while(left<right){
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
2.力扣541
本题规则比较复杂,搞清楚规则后就就可以轻松解决。
解题步骤:
- 讲字符串转换为字符数组,并利用for循环遍历数组
- 定义一个begin和end,分别记录待交换的区域
- 计算交换区域,begin=i,end=Math.min(nums.length-1,i+k-1)
- 然后交换数值
代码如下:
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i=0;i<ch.length;i+=2*k){
int start = i;
int end = Math.min(ch.length-1,i+k-1);
while (start < end) {
char temp = ch[start];
ch[start++] = ch[end];
ch[end--] = temp;
}
}
return new String(ch);
}
3.剑指Offer 05.替换空格
本题利用了Java中可变字符串,使解题变得很方便;若不使用可变字符串则需要重新定义空间添加。还有一种思路是根据字符串中空格的数量,对数组进行扩容,然后把元素换位置的时候,顺便替换空格的值。
解题步骤:
- 定义一个可变字符串(哪个都行),然后遍历字符数组
- 若值为空格,则存%20进字符串中
- 若不为空格,则直接存进字符串中
- 最后可变字符串变为字符串就解决了
代码如下:
public String replaceSpace(String s) {
StringBuffer str = new StringBuffer();
for(int i=0;i<s.length();i++){
char ch = s.charAt(i);
if(ch!=' '){
str.append(ch);
}else{
str.append("%20");
}
}
return str.toString();
}
4.力扣151反转字符串中的单词
本题难度挺大,研究了好久,差不多一个多点哈哈哈;解题步骤大致分为3步,先反转整个链表,然后在反转每个单词,最后把单词收集起来并添加空格,这个题要多debug!!!
解题步骤:
- 首先反转整个数组,reverse(arr,0,arr.length-1)
- 接下来用for循环遍历数组,碰到空格则跳过,当遇到非空字符的时候,则用while循环遍历整个单词,便于反装整个数组
- 进行反转后,在尾部添加一个空格
- 最后返回反转后数组,在返回时也需要进行判断,为了防止尾部有多余空格。
代码如下:
public String reverseWords(String s) {
//反转整个字符串
char[] arr = s.toCharArray();
reverse(arr,0,arr.length-1);
int k=0;
int slow = 0;
for(int i=0;i<arr.length;i++){
//遇到空得则向后移动
if(arr[i]==' '){
continue;
}
int tempCur = i;
while(i<arr.length&&arr[i]!=' '){
i++;
}
for(int j=tempCur;j<i;j++){
if(j==tempCur){
reverse(arr,j,i-1);
}
arr[k++] = arr[j];
if(j==i-1){//遍历结束
if (k < arr.length) {
arr[k++] = ' ';
}
}
}
}
if(k==0){
return " ";
}else{
return new String(arr, 0, arr[k - 1] != ' ' ? k : k - 1);
}
}
public void reverse(char[] chars,int begin,int end){
for(int i=begin,j=end;i<j;i++,j--){
chars[i] ^= chars[j];
chars[j] ^= chars[i];
chars[i] ^= chars[j];
}
}