字符串part01
- day8-1 ● 344.反转字符串
- 整体思路
- 代码实现
- 总结
- day8-2 ● 541. 反转字符串II
- 整体思路
- 代码实现
- 总结
- day8-3 ● 卡码网:54.替换数字
- 题目
- 解题思路
- 代码实现
- 总结
day8-1 ● 344.反转字符串
整体思路
字符串和数组的思路差不多
原地操作
代码实现
class Solution {
/**
* 时间复杂度: O(n)
* 空间复杂度: O(1)
*/
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--;
}
}
}
总结
一般每门编程语言的都有库函数实现
day8-2 ● 541. 反转字符串II
整体思路
for
循环里面的 i
可以成段成段的跳越,不一定要 i++
一步一步地跳跃
代码实现
class Solution {
/**
* 时间复杂度: O(n)
* 空间复杂度: O(1)
*/
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
// 每隔2k将前k个字符进行反转
for(int i = 0; i < ch.length; i+=2*k){
if(i + k <= ch.length){// 取等与否可以用特殊用例测试 i=0 s=abc k=3
reverse(ch, i, i + k - 1);// 左闭右闭
continue;
}
// 剩余字母少于k个,则将剩余字符全部反转
reverse(ch, i, ch.length - 1);
}
return new String(ch);
}
private void reverse(char[] ch, int i, int j){
while(i < j){
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
i++;
j--;
}
}
}
class Solution {
/**
* 时间复杂度: O(n)
* 空间复杂度: O(1)
*/
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i = 0; i < ch.length; i+=2*k){
int start = i;
int end = Math.min(ch.length - 1, start + k -1);
while(start < end){
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start++;
end--;
}
}
return new String(ch);
}
}
总结
for循环里面的i可以成段成段(2k 段)的跳越,不一定要 i++
一步一步地跳跃
day8-3 ● 卡码网:54.替换数字
题目
解题思路
从后向前填充,减少空间复杂度
代码实现
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String s = sc.next();
int len = s.length();
// 统计长度
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){
len += 5;
}
}
// 拷贝
char[] res = new char[len];
for(int i = 0; i < s.length(); i++){
res[i] = s.charAt(i);
}
// 替换
for(int i = s.length() - 1, j = len - 1; i >= 0;i-- ){
if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){
res[j--] = 'r';
res[j--] = 'e';
res[j--] = 'b';
res[j--] = 'm';
res[j--] = 'u';
res[j--] = 'n';
}else{
res[j--] = res[i];
}
}
System.out.println(res);
}
}
总结
acm模式得多熟悉熟悉