力扣344:反转字符串
题目链接:力扣344:反转字符串
思路:
1.定义两个指针left和right,分别指向第一个元素和最后一个元素
2.不断的去移动两个指针向中间移动,并交换两个指针指向的元素
代码:
public void reverseString(char[] s) {
// 1.定义两个指针left和right,分别指向第一个元素和最后一个元素
int left = 0;
int right = s.length - 1;
while (left < right) {
// 2.交换两个指针所指向的元素
char temp = s[left];
s[left] = s[right];
s[right] = temp;
// 3.移动两个指针向中间移动
left++;
right--;
}
}
力扣541:反转字符串||
题目链接:力扣541:反转字符串||
思路:
1.将字符串s转为字符数组
2.遍历数组,注意下标值每次累加2k
3.设置两个指针left和right,分别指向当前数组和最后一个要反转的字符
4.进行反转
代码:
public String reverseStr(String s, int k) {
// 1.将字符串s转为字符数组
char[] chars = s.toCharArray();
// 2.遍历数组,注意下标值每次累加2k
for (int i = 0; i < chars.length - 1; i += (2 * k)) {
// 3.设置两个指针left和right,分别指向当前数组和最后一个要反转的字符
int left = i;
int right = Math.min(i + k - 1, chars.length - 1);
while (left < right) {
// 4.进行反转
char temp = chars[left];
chars[left] = chars[right];
chars[right] = temp;
left++;
right--;
}
}
return new String(chars);
}
剑指offer05:替换空格
题目链接:剑指offer05:替换空格
思路:
1.定义一个字符串变量
2.遍历字符串中的每个字符,遇到空格,则往字符串变量添加两个空格,目的是为了扩容
3.将字符串变量追加到参数s中
4.定义两个指针,分别指向原始字符串最后一个位置left和扩展后的字符串的最后一个位置right
5.不断的向前移动left,如果left等于空格,则将right往前指向三个元素填充%20;如果left不等于空格,则直接移动到right指向的位置
6.left和right指针不断的向前移动
代码:
public String replaceSpace(String s) {
if(s == null || s.length() == 0){
return s;
}
//扩充空间,空格数量2倍
StringBuilder str = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i) == ' '){
str.append(" ");
}
}
//若是没有空格直接返回
if(str.length() == 0){
return s;
}
//有空格情况 定义两个指针
int left = s.length() - 1;//左指针:指向原始字符串最后一个位置
s += str.toString();
int right = s.length()-1;//右指针:指向扩展字符串的最后一个位置
char[] chars = s.toCharArray();
while(left>=0){
if(chars[left] == ' '){
chars[right--] = '0';
chars[right--] = '2';
chars[right] = '%';
}else{
chars[right] = chars[left];
}
left--;
right--;
}
return new String(chars);
}
力扣151:反转字符串中的单词
题目链接:力扣151:反转字符串中的单词
思路:
1.将字符串转为字符数组,方便进行反转
2.去除多余空格,定义两个指针慢指针和快指针,slow和fast,fast用于遍历数组中的元素,slow用于指向新的元素
3.当快指针不为空的时候,则放入slow所指向的位置;注意:当快指针不为空且slow!=0,则slow需要向后移动一步且赋值为’ ’
4.反转字符数组
5.反转每个单词,定义三个指针,分别指向第一个元素和最后一个元素,另外一个指向每个空格位置
6.将字符数组添加到String字符变量中
代码:
class Solution {
public String reverseWords(String s) {
// 1.将字符串转为字符数组,方便进行反转
char[] chars = s.toCharArray();
// 2.去除多余空格,定义两个指针慢指针和快指针,slow和fast,fast用于遍历数组中的元素,slow用于指向新的元素
int slow = 0;
int fast = 0;
while (fast < chars.length) {
if (chars[fast] != ' ') {
// 3.当快指针不为空的时候,则放入slow所指向的位置;注意:当快指针不为空且slow!=0,则slow需要向后移动一步且赋值为' '
if (slow != 0) {
chars[slow] = ' ';
slow++;
}
while(fast < chars.length && chars[fast] != ' ') {
chars[slow] = chars[fast];
slow++;
fast++;
}
}
fast++;
}
// 4.反转字符数组
int left = 0;
int right = slow - 1;
reverse(left, right, chars);
// 5.反转每个单词,定义三个指针,分别指向第一个元素和最后一个元素,另外一个指向每个空格位置
int start = 0;
int end = start + 1;
int length = slow;
while (start < slow) {
while (end != length && chars[end] != ' ') {
end += 1;
}
reverse(start, end - 1, chars);
start = end + 1;
end += 1;
}
// 6.将字符数组添加到String字符变量中
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < slow; i++) {
stringBuffer.append(chars[i]);
}
return stringBuffer.toString();
}
private void reverse(int left, int right, char[] chars) {
while (left < right) {
char temp = chars[left];
chars[left] = chars[right];
chars[right] = temp;
left++;
right--;
}
}
}
剑指offer58:左旋转字符串
题目链接:剑指offer58:左旋转字符串
思路:
1.局部反转前n个字符
2.局部反转n到最后一个字符
3.反转整个字符串
代码:
class Solution {
public String reverseLeftWords(String s, int n) {
char[] chars = s.toCharArray();
// 1.局部反转前n个字符
reverse(0, n - 1, chars);
// 2.局部反转n到最后一个字符
reverse(n, chars.length - 1, chars);
// 3.反转整个字符串
reverse(0, chars.length - 1, chars);
return new String(chars);
}
private void reverse(int left, int right, char[] chars) {
while (left < right) {
char temp = chars[left];
chars[left] = chars[right];
chars[right] = temp;
left++;
right--;
}
}
}