目录
344.反转字符串
1.解题思路
题目中是必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题,所以不能用另外一个数组来接收,但是可以使用双指针,从两边交换,直到right>=left为止。
2.我的实现
实现遇到的问题
无
代码
public void reverseString(char[] s) {
int left=0;
int right=s.length-1;
while (left<=right){
char tmp=s[left];
s[left]=s[right];
s[right]=tmp;
left++;
right--;
}
}
3.标准实现
class Solution {
public void reverseString(char[] s) {
int l = 0;
int r = s.length - 1;
while (l < r) {
s[l] ^= s[r]; //构造 a ^ b 的结果,并放在 a 中
s[r] ^= s[l]; //将 a ^ b 这一结果再 ^ b ,存入b中,此时 b = a, a = a ^ b
s[l] ^= s[r]; //a ^ b 的结果再 ^ a ,存入 a 中,此时 b = a, a = b 完成交换
l++;
r--;
}
}
}
// 第二种方法用temp来交换数值更多人容易理解些
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--;
}
}
}
区别
没区别
4.题目总结
1. 原地操作
- 原地反转意味着不能创建新的数组来存储结果,必须在原数组上直接进行操作。这要求对空间的使用非常谨慎。
2. 双指针法
- 使用双指针法是解决这类问题的最佳选择。一个指针从数组的起始位置开始,另一个指针从数组的末尾开始,两者向中间移动并交换元素,直到两个指针相遇。
541.反转字符串Ⅱ
1.解题思路
遍历字符串的时候i+2k遍历,处理前k个,当不足k个时,再反转所有的,要用到上一题的反转函数,只是前面的反转函数会修改一下,多传个参数k。
2.我的实现
实现遇到的问题
数组变成字符串:
运用String.valueOf
String.valueOf
是一个多功能的方法,能够将各种类型的值转换为字符串表示。
// 基本类型转换为字符串
int num = 42;
String intStr = String.valueOf(num); // "42"
// 字符数组转换为字符串
char[] charArray = {'J', 'a', 'v', 'a'};
String charArrayStr = String.valueOf(charArray); // "Java"
// 对象转换为字符串
Object obj = new Object();
String objStr = String.valueOf(obj); // obj.toString() 的结果
// 处理 null 对象
Object nullObj = null;
String nullStr = String.valueOf(nullObj); // "null"
continue
与 break
的区别
continue
:跳过当前循环迭代,继续下一次迭代。break
:完全退出循环,不再进行后续迭代。
代码
public void reverseString(char[] s,int j,int k) {
int left=j;
int right=k;
while (left<=right-1){
char tmp=s[left];
s[left]=s[right-1];
s[right-1]=tmp;
left++;
right--;
}
}
public String reverseStr(String s, int k) {
char[] res=s.toCharArray();
for (int i = 0; i < res.length; i+=2*k) {
if (i+k<=res.length){
reverseString(res,i,i+k);
continue;
}
reverseString(res,i,res.length);
}
return String.valueOf(res);
}
3.标准实现
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
// 1. 每隔 2k 个字符的前 k 个字符进行反转
for (int i = 0; i< ch.length; i += 2 * k) {
// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
if (i + k <= ch.length) {
reverse(ch, i, i + k -1);
continue;
}
// 3. 剩余字符少于 k 个,则将剩余字符全部反转
reverse(ch, i, ch.length - 1);
}
return new String(ch);
}
// 定义翻转函数
public void reverse(char[] ch, int i, int j) {
for (; i < j; i++, j--) {
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
}
}
}
4.题目总结
逐段处理字符串
- 字符串按照
2k
字符一组进行处理,每组中的前k
个字符需要被反转。 - 需要处理字符串末尾的特殊情况,判断剩余字符的数量。
// 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
if (i + k <= ch.length) {
reverse(ch, i, i + k -1);
continue;
}
// 3. 剩余字符少于 k 个,则将剩余字符全部反转
reverse(ch, i, ch.length - 1);
卡码网:54.替换数字(!!!)
1.解题思路
1. 遍历字符串
- 步骤:
- 遍历输入字符串的每一个字符。
- 判断当前字符是字母还是数字。
- 如果是字母:直接将该字符添加到结果字符串中。
- 如果是数字:将字符串
"number"
添加到结果字符串中。
2. 判断字符类型
- 可以使用
Character.isLetter()
方法来判断字符是否为字母。 - 使用
Character.isDigit()
方法判断字符是否为数字。
3. 使用 StringBuilder
构建结果字符串
StringBuilder
是 Java 中用于高效地构建和修改字符串的类。- 在遍历过程中,将处理后的字符或字符串依次添加到
StringBuilder
中。 - 最后,将
StringBuilder
转换为字符串得到结果。
2.我的实现
实现遇到的问题
StringBuilder的使用
StringBuilder
是 Java 中用于创建可变字符串的类。与 String
类不同,StringBuilder
的内容可以在原始对象中被修改,而 String
是不可变的,每次修改都会创建一个新的对象。因此,StringBuilder
在频繁修改字符串的场景下性能优于 String
。
toString()
方法
- 将
StringBuilder
转换为String
对象。
代码
public class Thsz {
public static String replaceDigits(String s) {
if (s == null || s.isEmpty()) {
return s; // 处理空字符串或null的情况
}
StringBuilder result = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char currentChar = s.charAt(i);
if (Character.isDigit(currentChar)) {
result.append("number");
} else {
result.append(currentChar);
}
}
return result.toString();
}
}
3.标准实现
import java.util.Scanner;
public class Main {
public static String replaceNumber(String s) {
int count = 0; // 统计数字的个数
int sOldSize = s.length();
for (int i = 0; i < s.length(); i++) {
if(Character.isDigit(s.charAt(i))){
count++;
}
}
// 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小
char[] newS = new char[s.length() + count * 5];
int sNewSize = newS.length;
// 将旧字符串的内容填入新数组
System.arraycopy(s.toCharArray(), 0, newS, 0, sOldSize);
// 从后先前将空格替换为"number"
for (int i = sNewSize - 1, j = sOldSize - 1; j < i; j--, i--) {
if (!Character.isDigit(newS[j])) {
newS[i] = newS[j];
} else {
newS[i] = 'r';
newS[i - 1] = 'e';
newS[i - 2] = 'b';
newS[i - 3] = 'm';
newS[i - 4] = 'u';
newS[i - 5] = 'n';
i -= 5;
}
}
return new String(newS);
};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
System.out.println(replaceNumber(s));
scanner.close();
}
}
4.题目总结
- 字符判断:使用
Character.isDigit(c)
来判断字符是否是数字,这样可以清晰地识别并替换数字字符。 - 性能优化:
StringBuilder
是处理这种字符串拼接操作的最佳选择,因为它不会像String
那样在每次修改时创建新的对象。