反转字符串
Ⅰ
- 题目链接:整体原地反转
- 我的解法:双指针相向变交换边移动
class Solution {
public void reverseString(char[] s) {
int i = 0;
int j = s.length - 1;
for(; i < j; i++, j--)
{
char tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
}
}
- 复杂度:时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)
Ⅱ
- 题目链接:k为区间反转
- 我的解法:过于纠结区间划分是对应三种情况的尾区间的界定,还是一板一眼的界定2*k区间,逻辑混乱仅通过35用例
class Solution {
public String reverseStr(String s, int k) {
int len = s.length();
if(len < k) return s;
char[] str = s.toCharArray();
int low = 0; int fast = 1;
while(fast < len)
{
if(((low + 1) % k) == 0){
int left = low - k + 1;int right = low;
// System.out.print(left);
// System.out.println(right);
while(left < right)
{
char c = str[left];
str[left] = str[right];
str[right] = c;
left++;
right--;
}
low = fast + 1;
fast = low + k;
}
else
{
low++;
fast++;
if(fast < len) fast++;
else break;
}
}
System.out.print(low);
System.out.println(fast);
if(((low + 1) % k) == 0)
{
int left = low - k + 1;int right = low;
// System.out.print(left);
// System.out.println(right);
while(left < right)
{
char c = str[left];
str[left] = str[right];
str[right] = c;
left++;
right--;
}
}
if(((low + 1) % k) > 0 && ((low + 1) % k) < k)
{
int left = low;
if(low < k) left = 0;
int right = len - 1;
while(left < right)
{
char c = str[left];
str[left] = str[right];
str[right] = c;
left++;
right--;
}
}
return String.valueOf(str);
}
}
- 正确解法:
class Solution {
public String reverseStr(String s, int k) {
char[] str = s.toCharArray();
for(int i = 0; i < str.length; i += 2*k)
{
//反转区间的start和end
int start = i;
int end = Math.min(i + k - 1, str.length - 1);
while(start < end)
{
char c = str[start];
str[start] = str[end];
str[end] = c;
start++;
end--;
}
}
return new String(str);
}
}
只需要关注要反转的区间以及每次区间的起点按2*k移动即可。
- 复杂度:时间复杂度 O ( k n ) O(kn) O(kn),空间复杂度 O ( 1 ) O(1) O(1)
替换字符串中字符
- 题目链接:替换字符串
- 我的解法:字符串拼接思想
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String string = in.nextLine();
String str = "";
for(int i = 0; i < string.length(); i++)
{
char c = string.charAt(i);
if(c >= '0' && c <= '9') str += "number";
else str += c;
}
System.out.println(str);
}
}
- 拓展解法:题目的原意据说是想在原地进行替换,java实现是 提前统计数字数量计算扩容大小,创建包含旧字符串的新字符串,双指针从后往前更改新数组
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String string = in.nextLine();
char[] str = string.toCharArray();
int cnt = 0;
for(int i = 0; i < string.length(); i++)
{
if(str[i] >= '0' && str[i] <= '9')
cnt++;
}
char[] newStr = new char[str.length + cnt * 5];
for(int i = 0, idx = 0; i < str.length; i++)
{
newStr[idx++] = str[i];
}
int right = newStr.length - 1;
int left = str.length - 1;
while(left >= 0)
{
if(newStr[left] >= '0' && newStr[left] <= '9')
{
newStr[right--] = 'r';
newStr[right--] = 'e';
newStr[right--] = 'b';
newStr[right--] = 'm';
newStr[right--] = 'u';
newStr[right--] = 'n';
}
else newStr[right--] = newStr[left];
left--;
}
System.out.println(new String(newStr));
}
}
总结:
字符数组转字符串:String str = new String(charr)
字符串转字符数组:char[] = str.toCharArray()
- 复杂度:时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)