我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第n篇文章,点击查看活动详情
前言
今天开始算法进入字符串专项练习,今日任务:
344. 反转字符串
题目描述
思路分析
这个类似于双指针, 两个元素交换
代码展示
public static void reverseString(char[] s) {
for (int i = 0; i < s.length / 2; i++) {
char temp = s[i];
s[i] = s[s.length - i - 1];
s[s.length - i - 1] = temp;
}
}
提交记录
541. 反转字符串 II
题目描述
思路分析
先对每 2k个数按照要求进行反转, 然后在判断最后几个数要反转的下标, 按要求进行反转
代码展示
public static String reverseStr(String s, int k) {
char[] chars = s.toCharArray();
int left = 0, right = 2 * k;
while(right < s.length()){
int m = left + k - 1;
while(left < m){
char temp = chars[left];
chars[left++] = chars[m];
chars[m--] = temp;
}
left = right;
right += 2*k;
}
right = s.length() - left < k ? s.length() - 1: left + k - 1;
while(left < right){
char temp = chars[left];
chars[left++] = chars[right];
chars[right--] = temp;
}
return String.valueOf(chars);
}
提交结果
剑指 Offer 05. 替换空格
题目描述
思路分析
- 遍历字符串
- 每个字符串是否为 空格
- 如果为空格则替换为 %20
- 使用 StringBuilder,因为要进行多次的字符串修改操作
代码展示
public static String replaceSpace(String s) {
char[] chars = s.toCharArray();
StringBuilder str = new StringBuilder();
for (char aChar : chars) {
if(aChar == ' '){
str.append("%20");
}else{
str.append(aChar);
}
}
return str.toString();
}
提交结果
151. 反转字符串中的单词
题目描述
思路分析
简单来说就是遍历字符串保存每一个单词,然后倒序输出就可以了
注意事项:
- 字符串以空格开头
- 字符串以空格结尾
- 每两个单词中间存在多个空格
代码展示
public static String reverseWords(String s) {
StringBuilder str = new StringBuilder();
char[] chars = s.toCharArray();
Stack<String> stack = new Stack<>();
for (char aChar : chars) {
if (aChar == ' '){
if (!str.toString().equals("")){
stack.push(str.toString());
str = new StringBuilder();
}
}else{
str.append(aChar);
}
}
if (!"".equals(str.toString())){
stack.push(str.toString());
}
str = new StringBuilder();
while(!stack.isEmpty()){
str.append(stack.pop());
str.append(' ');
}
return str.deleteCharAt(str.length() - 1).toString();
}
提交记录
总结
可以看到,这道题每一次都会出现错误,每一次都是在细节的问题上,希望有一天做题能够考虑的更加周到
剑指 Offer 58 - II. 左旋转字符串
题目描述
思路分析
还是遍历字符串,根据 n来当做分界值,先遍历 >=n的值,在遍历 <n的值
【代码展示】中分别是上次提交和本次提交的代码, 咱也不知道为啥上次写的那么麻烦, 但是确实是执行用时会少一点,毕竟是在同一个字符串内进行操作,但是代码量会多很多,内存消耗差不多
代码展示
上次代码
public String reverseLeftWords(String s, int n) {
char[] chars = s.toCharArray();
int length = chars.length;
int t = n;
for (int i = 0; i < n; i++) {
n--;
char temp = chars[i];
chars[i] = chars[n];
chars[n] = temp;
}
for (int i = t; i < length; i++) {
char temp = chars[i];
chars[i] = chars[length - 1];
chars[length - 1] = temp;
length--;
}
length = chars.length;
for (int i = 0; i < length; i++) {
char temp = chars[i];
chars[i] = chars[length - 1];
chars[length - 1] = temp;
length--;
}
return String.valueOf(chars);
}
本次代码
public static String reverseLeftWords(String s, int n) {
char[] chars = s.toCharArray();
StringBuilder str = new StringBuilder();
for (int i = n; i < chars.length; i++) {
str.append(chars[i]);
}
for (int i = 0; i < n; i++) {
str.append(chars[i]);
}
return str.toString();
}
提交结果
总结
字符串专项练习截止到目前依旧是拿捏,根据目前的练习,字符串方面主要还是以遍历为主,依托于遍历来进行的各种其他操作
本文内容到此结束了
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位大佬指出。
我是 宁轩 , 我们下次再见