LeetCode:344. 反转字符串 - 力扣(LeetCode)
1.思路
双指针法
2.代码实现
class Solution {
public void reverseString(char[] s) {
int left = 0;
int right = s.length - 1;
// 双指针
while (left <= right) {
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}
3.复杂度分析
时间复杂度:O(n).
空间复杂度:O(1).
LeetCode:541. 反转字符串 II - 力扣(LeetCode)
1.思路
相比于反转字符串,本题多了一层for循环和跳跃判断条件,字符串和数组的转换。
2.代码实现
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i += 2 * k) {
int left = i;
int right = Math.min(ch.length - 1, left + k - 1);
while (left <= right) {
char temp = ch[left];
ch[left] = ch[right];
ch[right] = temp;
left++;
right--;
}
}
return new String(ch);
}
}
3.复杂度分析
时间复杂度:O(n^2).
空间复杂度:O(n).
LeetCode:剑指 Offer 05. 替换空格 - 力扣(LeetCode)
1.思路
调用s.trim()方法,去除s前后空格,String本身不可变,创建StringBuilder进行中间转换,for循环遍历,遇到空格添加"%20",否则添加相应字符即可。
2.代码实现
class Solution {
public String replaceSpace(String s) {
s.trim();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ' ') {
sb.append("%20");
} else {
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}
3.复杂度分析
时间复杂度:O(n).
空间复杂度:O(n).
LeetCode:
1.思路
去除字符串前后空格,去除中间多余空格,将字符串整体反转,将每个单词反转,返回即可
2.代码实现
// 写半天整个超时的,大怨种
class Solution {
public String reverseWords(String s) {
// 反转整个字符串,反转单词,返回结果即可
s.trim();
// 去除中间多余空格
StringBuilder sb = new StringBuilder(s);
for (int i = s.length() - 1; i > 0; i--) {
while (sb.charAt(i) == ' ' && sb.charAt(i) == s.charAt(i - 1)) {
i--;
}
sb.append(sb.charAt(i));
}
char[] ch = new char[sb.length()];
for (int i = 0; i < ch.length; i++) {
ch[i] = sb.charAt(i);
}
int left = 0;
for (int i = 0; i < ch.length; i++) {
if (ch[i] == ' ') {
int right = i - 1;
while (left <= right) {
char temp = ch[left];
ch[left] = ch[right];
ch[right] = temp;
}
left = i + 1;
}
continue;
}
return Arrays.toString(ch);
}
}
// 又又抄了一遍
class Solution {
public String reverseWords(String s) {
// 去除首尾及中间多余的空格
StringBuilder sb = removeSpace(s);
// 反转整个字符串
reverseString(sb, 0, sb.length() - 1);
// 反转每个单词
reverseEachWord(sb);
// 返回结果
return sb.toString();
}
//
public StringBuilder removeSpace(String s) {
int start = 0;
int end = s.length() - 1;
while (s.charAt(start) == ' ') start++;
while (s.charAt(end) == ' ') end--;
StringBuilder sb = new StringBuilder();
while (start <= end) {
char c = s.charAt(start);
if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
sb.append(c);
}
start++;
}
return sb;
}
public void reverseString(StringBuilder sb, int start, int end) {
while (start < end) {
char temp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, temp);
start++;
end--;
}
}
private void reverseEachWord(StringBuilder sb) {
int start = 0;
int end = 1;
int n = sb.length();
while (start < n) {
while (end < n && sb.charAt(end) != ' ') {
end++;
}
reverseString(sb, start, end - 1);
start = end + 1;
end = start + 1;
}
}
}
3.复杂度分析
时间复杂度:O(n^2).
空间复杂度:O(n).
LeetCode:剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode)
1.思路
野路子,分两段添加
2.代码实现
class Solution {
public String reverseLeftWords(String s, int n) {
// 分两次写入
if (n < 1) return s;
StringBuilder sb = new StringBuilder();
for (int i = n ; i < s.length(); i++) {
sb.append(s.charAt(i));
}
for (int i = 0; i < n; i++) {
sb.append(s.charAt(i));
}
return sb.toString();
}
}
3.复杂度分析
时间复杂度:O(n).
空间复杂度:O(n).