代码随想录算法训练营第八天 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串
今天可以稍微从学校事务中脱离出来了,补补昨天的。😶🌫️
今天感觉还不错,当然有些问题想了很久看了视频和解析才明白个大搞,今后还需要再复习一下。
344.反转字符串link
题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
思路:使用双指针求解,两个指针分别位于两端,然后借助临时变量,交换位置,然后指针向中间缩。
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--;
}
}
}
541. 反转字符串IIlink
题目:给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
注意事项大部分在代码中。
end地方可能不好理解,可以画图试试。稍微的再说一下这个地方,为什么尾数不到k个时,end成为 op.length-1 那?可以想一下假设k=7,现在start距离尾部只有三个值了,那么在start的基础上再加上k-1会超出去,所以我们要反转从start开始到末尾。
class Solution {
public String reverseStr(String s, int k) {
char[] op = s.toCharArray();
for (int i = 0; i < op.length; i += 2 * k) {
int start = i;
//end指向的是要反转的最后一位
int end = Math.min(op.length - 1, start + k - 1);
//end这样取值的原因是判断尾数够不够k,不够的话则会出现end=op.length-1,若够的话为start+k-1(-1的原因是可以画图看一下,start指向的值也要反转,所以要-1)
while (start < end) {
//使用异或运算(^)进行操作:相同为0,不同为1
op[start] ^= op[end];
//新op[s]=旧op[s]^旧op[e]
op[end] ^= op[start];
//新op[e]=旧op[e]^新op[s]=旧op[e]^旧op[s]^旧op[e](根据0^x=x)新op[e]=旧op[s]//现在op[end]就已经存储原先op[start]的值了
//则新op[e]=旧op[s]
op[start] ^= op[end];
//新新op[s]=新op[s]^新op[end]=旧op[s]^旧op[e]^旧op[s]=旧op[e]
start++;
end--;
}
}
return new String(op);
}
}
卡码网:54.替换数字link
题目:给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
卡哥自己的刷题网站,我也是刚使用,感觉挺好的,有智能提示!
比较好理解,看看代码应该可以理解。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
String s = scanner.nextLine();
char[] op = s.toCharArray();
for (int i = 0; i < op.length; i++) {
char cur = op[i];
if ((int) (cur - '0') >= 0 && (int) (cur - '0') <= 9) {
sb.append("number");
} else {
sb.append(cur);
}
}
System.out.println(sb.toString());
}
}
151.翻转字符串里的单词link
题目:给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
提示:trim() 方法用于删除字符串的头部和尾部空白符。
class Solution {
public String reverseWords(String s) {
s = s.trim();
//i,j作为指针
int j = s.length() - 1;
int i = j;
StringBuilder sb = new StringBuilder();
while (i >= 0) {
while (i >= 0 && s.charAt(i) != ' ')
i--;
//结束时,i已经指向了一个空格
sb.append(s.substring(i + 1, j + 1) + " ");//注意:左闭右开
//跳过空格
while (i >= 0 && s.charAt(i) == ' ')
i--;
//最后i落脚到字母上
j = i;
}
return sb.toString().trim();
}
}
卡码网:55.右旋转字符串link
题目:字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 “abcdefg” 和整数 2,函数应该将其转换为 “fgabcde”。
这道题也是挺好理解的,直接上代码了。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int k = scanner.nextInt();
String s = scanner.next();
StringBuilder sb = new StringBuilder();
int cur = s.length() - 1;
//先找出后k个字符
while (k > 1) {
cur--;
k--;
}
sb.append(s.substring(cur, s.length()));
sb.append(s.substring(0, cur));
System.out.println(sb.toString());
}
}
感谢您的观看,我要赶今天的任务了,hh🤪