344. 反转字符串
题目:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
要求不要给另外的数组分配额外的空间,你必须原地修改输入数组,使用 O(1) 的额外空间解决这一问题。
可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
解题思路:
使用异或运算来交换数组中左右两端的字符位置,从而实现字符串反转。通过异或的性质 a ^ a = 0 和 a ^ 0 = a,实现原地交换,避免使用额外空间。
反思:
异或运算的三个步骤可以实现两个字符位置的交换:
s[r] ^= s[l];s[l] ^= s[r];s[r] ^= s[l];
由于异或操作的性质,经过三次操作后,s[l] 和 s[r] 的值会互换。在 Java 中,由于 char 类型有固定的大小(16-bit),按位操作会被视为 int 类型,因此必须显式进行类型转换。
代码:
class Solution {
public void reverseString(char[] s) {
int right = s.length - 1;
for (int i = 0; i < right; i++) {
s[i] ^= s[right];
s[right] ^= s[i];
s[i] ^= s[right];
right--;
}
}
}
541. 反转字符串 II
题目:
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
- 如果剩余字符少于
k个,则将剩余字符全部反转。 - 如果剩余字符小于
2k但大于或等于k个,则反转前k个字符,其余字符保持原样。
解题思路:
将字符串转化为字符数组,每次处理 2k 个字符,反转前 k 个字符。如果剩余不足 k 个则全部反转,否则只反转前 k 个。
反思:
忘记将 n-- 写入第二个循环条件,导致数组未完全反转,修正为确保每个字符都被正确处理。
代码:
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i = i + 2 * k) {
int n = 0;
if (i + k - 1 > ch.length - 1) {
n = ch.length - 1;
} else {
n = i + k - 1;
}
for (int j = i; j < n; j++) {
ch[j] ^= ch[n];
ch[n] ^= ch[j];
ch[j] ^= ch[n];
n--;
}
}
return new String(ch);
}
}
替换数字字符
题目:
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为 number。
例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
解题思路:
遍历字符串中的每个字符,遇到字母保持不变,遇到数字则将其替换为 "number"。由于替换会增加字符长度,因此需要一个新的字符数组来存储结果。
反思:
- 在第二个
for循环中条件为i > 0,导致未能处理第一个字符,修正为i >= 0。 - 在替换数字时,必须注意新数组
newch的索引管理,防止越界,使用right--保证按正确顺序插入字符。
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
char[] ch = s.toCharArray();
int count = 0;
for (int i = 0; i < ch.length; i++) {
if (ch[i] >= '0' && ch[i] <= '9') {
count++;
}
}
char[] newch = new char[ch.length + count * 5];
int right = newch.length - 1;
for (int i = ch.length - 1; i >= 0; i--) {
if (ch[i] >= '0' && ch[i] <= '9') {
newch[right--] = 'r';
newch[right--] = 'e';
newch[right--] = 'b';
newch[right--] = 'm';
newch[right--] = 'u';
newch[right--] = 'n';
} else {
newch[right] = ch[i];
right--;
}
}
System.out.println(new String(newch));
scanner.close();
}
}

被折叠的 条评论
为什么被折叠?



