344.反转字符串
思路:双指针,用一个临时变量存储来交换
总结:双指针的一种形式就是从两边向中间移动
541. 反转字符串II
for循环中不是i++而是每次i+=2*k
最后不足2k的部分通过if else来判断
if(i+k-1 <= n-1){
reverseK(i,i+k-1,str);
}else{
//for fewer than k characters left (edge case)
reverseK(i,n-1,str);
}
替换数字
Java 没法修改String,只能使用辅助空间
如果可以修改String:
有多少个数字就把该字符延长差值的多少倍
再用双指针从后往前填完
#include<iostream>
using namespace std;
int main() {
string s;
while (cin >> s) {
int count = 0; // 统计数字的个数
int sOldSize = s.size();
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
count++;
}
}
// 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小
s.resize(s.size() + count * 5);
int sNewSize = s.size();
// 从后先前将空格替换为"number"
for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {
if (s[j] > '9' || s[j] < '0') {
s[i] = s[j];
} else {
s[i] = 'r';
s[i - 1] = 'e';
s[i - 2] = 'b';
s[i - 3] = 'm';
s[i - 4] = 'u';
s[i - 5] = 'n';
i -= 5;
}
}
cout << s << endl;
}
}
其实很多数组(字符串)填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
151.翻转字符串里的单词
卡码网:55.右旋转字符串
可以用双指针去除字符串中空格:参考移除数组中的元素
反转子字符串:先整体反转字符串再局部反转字符串
java 没法不申请辅助空间来完成
public class Solution {
public String reverseWords(String s) {
if (s == null) return null;
char[] a = s.toCharArray();
int n = a.length;
// step 1. reverse the whole string
reverse(a, 0, n - 1);
// step 2. reverse each word
reverseWords(a, n);
// step 3. clean up spaces
return cleanSpaces(a, n);
}
void reverseWords(char[] a, int n) {
int i = 0, j = 0;
while (i < n) {
while (i < j || i < n && a[i] == ' ') i++; // skip spaces
while (j < i || j < n && a[j] != ' ') j++; // skip non spaces
reverse(a, i, j - 1); // reverse the word
}
}
// trim leading, trailing and multiple spaces
String cleanSpaces(char[] a, int n) {
int i = 0, j = 0;
while (j < n) {
while (j < n && a[j] == ' ') j++; // skip spaces
while (j < n && a[j] != ' ') a[i++] = a[j++]; // keep non spaces
while (j < n && a[j] == ' ') j++; // skip spaces
if (j < n) a[i++] = ' '; // keep only one space
}
return new String(a).substring(0, i);
}
// reverse a[] from a[i] to a[j]
private void reverse(char[] a, int i, int j) {
while (i < j) {
char t = a[i];
a[i++] = a[j];
a[j--] = t;
}
}
}
文章讲述了如何使用双指针技术反转字符串,处理字符串中数字的扩展和替换,以及在Java中反转单词和处理多余空格的方法。涉及到了字符串操作、数组处理和空间优化等技术。
562





