目录
LeetCode#344. 反转字符串
题目简介
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例一
输入:s = [“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]
示例二
输入:s = [“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]
思想逻辑
- 实现: 双指针
- 逻辑: 在字符串的头部和尾部设定指针,在保证边界条件的情况下,循环遍历交换元素
代码如下
class Solution {
public void reverseString(char[] s) {
int left = 0;
int right = s.length - 1;
//处理边界条件,防止越界
for(;left < right && left >= 0 && right > 0;left++, right--){
swap(s, left, right);
}
}
//与或运算
public void swap(char[] s, int left, int right){
s[left] ^= s[right];
s[right] ^= s[left];
s[left] ^= s[right];
}
}
LeetCode#541. 反转字符串 II
题目简介
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
-
如果剩余字符少于 k 个,则将剩余字符全部反转。
-
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例一
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”
示例二
输入:s = “abcd”, k = 2
输出:“bacd”
思想逻辑
- 实现: 指针
- 逻辑: 在保证边界条件的情况下(1、不遍历2 * k的子串;2、i + k不大于最大边界),反转子串,如果不满足2 * k的条件,直接反转剩下的子串。
代码如下
class Solution {
public String reverseStr(String s, int k) {
char[] array = s.toCharArray();
//我们在反转子串时,有2k的子串不用动,所以我们直接跳过这些2k子串
for(int i = 0; i < array.length; i += 2 * k){
if(i + k <= array.length){
//这里的边界是左闭右开,所以需要 - 1
swap(array, i, i + k - 1);
continue;
}
swap(array, i, array.length - 1);
}
return new String(array);
}
public void swap(char[] arr, int i, int j){
// for(; i < j; i++, j--){
while(i < j){
arr[i] ^= arr[j];
arr[j] ^= arr[i];
arr[i] ^= arr[j];
i++;
j--;
}
}
}
LeetCode#剑指 Offer 05. 替换空格
题目简介
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例一
输入:s = “We are happy.”
输出:“We%20are%20happy.”
思想逻辑
- 实现: 指针
- 逻辑: 创建StringBuilder,遍历字符串,如果这个数组中有 ‘空格’ ,就将它替换为%20,并加入新的字符串中
代码如下
class Solution {
public String replaceSpace(String s) {
if(s == null) return null;
StringBuilder buit = new StringBuilder();
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) == ' '){
buit.append("%20");
}else{
buit.append(s.charAt(i));
}
}
return buit.toString();
}
}