今日内容
- leetcode. 344 反转字符串
- leetcode. 541 反转字符串Ⅱ
- 卡码网. 54 替换数字
Leetcode. 344 反转字符串
虽然Java中就有reverse函数可以直接实现对字符串的反转,但这显然不是题目想要考验我们的地方。对于解题时库函数的使用,一般遵循这样的原则:当题目的关键部分可以用库函数直接解决的话,那么就不要用库函数;反之,题目的其他部分可以用库函数解决,且知晓了该函数的实现原理时,则可以使用。
本题中,我们采用双指针来反转字符串,具体如下图:
代码如下:
class Solution {
public void reverseString(char[] s) {
int start = 0;
int end = s.length - 1;
while (start < end){
char temp = s[start];
s[start] = s[end];
s[end] = temp;
start++;
end--;
}
}
}
- 时间复杂度:O(n)
- 空间复杂度:O(1)
Leetcode. 541 反转字符串Ⅱ
本题则是添加了几个反转字符串的要求,但是具体的反转操作是不变的。
代码如下:
class Solution {
public String reverseStr(String s, int k) {
char[] array = s.toCharArray();
int end = array.length;
for (int i = 0; i < end; i += 2 * k){ // 以 2 * k 为单位进行循环
if (end - i >= k + 1){ // 判断剩余字符数是否大于 k
reverse(array, i, i + k);
continue;
}
reverse(array, i, end);
}
return new String(array);
}
public void reverse(char[] s, int i, int k){ // 反转操作
k = k - 1;
while (i < k){
char temp = s[i];
s[i] = s[k];
s[k] = temp;
i++;
k--;
}
}
}
- 时间复杂度:O(n)
- 空间复杂度:O(1)
卡码网. 54 替换数字
本题给出一个字符串,它由小写字母和数字构成。现在需要将其数字字符替换为‘number’。
思路就是先遍历一遍字符串,得到数字的个数。再新建一个数组,将原有的字母和替换后的内容写入数组。最后将该数组转换为字符串。
代码如下:
public class Main{
public static void main (String[] args){
String result = test("a1b2c3");
System.out.println(result);
}
public static String test(String s){
char[] array = s.toCharArray();
int count = 0;
for (int i = 0; i < array.length; i++){ // 遍历字符串,获取数字字符个数
if (array[i] >= '0' && array[i] <= '9'){
count++;
}
}
int charLen = array.length - count;
char[] result = new char[charLen + 6 * count]; // 新建数组
int end = result.length - 1;
for (int i = array.length - 1; i >= 0; i--){// 将内容写入新数组中
if (array[i] >= '0' && array[i] <= '9'){
result[end--] = 'r';
result[end--] = 'e';
result[end--] = 'b';
result[end--] = 'm';
result[end--] = 'u';
result[end--] = 'n';
continue;
}
result[end--] = array[i];
}
return new String(result);
}
}
- 时间复杂度:O(n)
- 空间复杂度:O(n)
总结
这次内容了解了字符串的反转和替换操作。其中也知道了在解题过程中何时该使用库函数来解决问题。