LeetCode 344.反转字符串
题目描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例
输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]
题目链接
https://leetcode.cn/problems/reverse-string/description/
解题思路
双指针,左右两边进行交换
// 59s
class Solution {
public void reverseString(char[] s) {
int left = 0, right = s.length - 1;
while (left < right) {
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}
LeetCode 541. 反转字符串II
题目描述
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于
k个,则将剩余字符全部反转。 - 如果剩余字符小于
2k但大于或等于k个,则反转前k个字符,其余字符保持原样。
示例
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
题目链接
https://leetcode.cn/problems/reverse-string-ii/description/
解题思路
二刷还想半天,想的是在上一题基础上,先将字符串切割为指定内容,再对切割后的进行翻转。
实际上可以将字符串转为数组,再操作。
// 24m10s
class Solution {
public String reverseStr(String s, int k) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i += 2 * k) {
if (s.length() - i < k) {
sb.append(reverseS(s.substring(i)));
break;
} else {
sb.append(reverseS(s.substring(i, i + k)));
if (s.length() - i < 2 * k) {
sb.append(s.substring(i + k));
} else {
sb.append(s.substring(i + k, i + 2 * k));
}
}
}
return sb.toString();
}
public String reverseS(String str) {
int left = 0, right = str.length() - 1;
char[] s = str.toCharArray();
while (left < right) {
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
return new String(s);
}
}
卡码网:54.替换数字
题目描述
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
输入描述
输入一个字符串 s,s 仅包含小写字母和数字字符。
输出描述
打印一个新的字符串,其中每个数字字符都被替换为了number
示例
输入示例
a1b2c3
输出示例
anumberbnumbercnumber
题目链接
https://kamacoder.com/problempage.php?pid=1064
解题思路
- 新建
stringBulider类,遇到数字就插入number,否则插入字符。 - 直接用正则匹配
str.replaceAll("\\d", number)一行代码。 - 先遍历得到需要替换的数字个数,然后扩容数组,再从后往前插入
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String str = scanner.next();//获取输入的字符串
int length = str.length();
//确定替换后的数组长度大小
for(int i = 0; i < str.length(); i++){
if(Character.isDigit(s.charAt(i))){
length += 5;
}
}
char[] ch = new char[length];//构建一个新数组,长度为扩容后的大小
length--;//length在后面作数组下标, 所以要减1
for(int i = str.length() - 1; i >= 0; i--){
if(Character.isDigit(s.charAt(i))){//从后往前遍历, 如果是数字,则替换为number,注意替换的顺序是倒序,因为我们是倒序遍历的
ch[length--] = 'r';
ch[length--] = 'e';
ch[length--] = 'b';
ch[length--] = 'm';
ch[length--] = 'u';
ch[length--] = 'n';
}else{//是字母则添加到新数组
ch[length--] = str.charAt(i);
}
}
System.out.println(ch);
}
}
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
StringBuilder ans = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (Character.isDigit(s.charAt(i))) {
ans.append("number");
} else {
ans.append(s.charAt(i));
}
}
System.out.println(ans.toString());
}
}
评论