字符串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=3reverse(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模式得多熟悉熟悉