344反转字符串
自己的思路:这题比较简单,头尾的双指针遍历一遍就可以完成,而且这道题是字符数组,所以都不用考虑,创建一个新的数据结构,存放反转后的字符串。
class Solution {
public void reverseString(char[] s) {
int left = 0;
int right = s.length - 1;
while (left < right) {
char c = s[left];
s[left] = s[right];
s[right] = c;
left += 1;
right -= 1;
}
}
}
541反转字符串2
https://leetcode.cn/problems/reverse-string-ii/
自己的思路:
第一层遍历出要反转的字符子串的头和尾位置
0 - 2k - 1 中的 0 -> k -1
然后在双指针反转子字符串
这道题的难点是,1. 最后一个left -》 left + k - 1超出了字符串长度,所以取right值时要加个限制
2. 传入的是String s,想要改变字符串中的内容,但不需要改变大小,可以把String变成char【】
class Solution {
public String reverseStr(String s, int k) {
char[] result = s.toCharArray();
for (int i = 0; i < result.length; i += 2*k) {
//int end = i + 2k < s.length() ? (i + 2k -1) : s.length() - 1;
int left = i;
int right = i + k < s.length() ? i + k - 1 : s.length() - 1;
//System.out.println(left + " " + right);
while (left < right) {
char c = s.charAt(left);
result[left] = result[right];
result[right] = c;
left++;
right--;
}
}
return new String(result);
}
}
151反转字符串里的单词
这道题,StringBuffer类型的用法也作为了一个难点,要想改变当前String的内容和长度,存入一个新字符串中,就需要StringBuffer
1. 第一层遍历,去掉字符串两侧的空格,以及单词之间超过1个的空格,
先找到原字符串中去掉空格后的起始和结束的下标,在逐个遍历字符串中的字符,加入新的StringBuffer
2. 整个字符串反转
3. 把字符串中的每个单词反转,
遍历整个字符串,遇到空格就停下,得到要反转的单词的起始和结尾,进行反转
class Solution {
public String reverseWords(String s) {
StringBuffer res = new StringBuffer();
res = removeSpaces(s);
res = reverseAll(res);
res = reverseEachWord(res);
return res.toString();
}
public StringBuffer removeSpaces(String s) {
StringBuffer res = new StringBuffer();
int left = 0;
int right = s.length() - 1;
while (s.charAt(left) == ' ') {
left++;
}
while (s.charAt(right) == ' ') {
right--;
}
for (int i = left; i <= right; i++) {
if (s.charAt(i) == ' ' && s.charAt(i - 1) == ' ') {
continue;
}
res.append(s.charAt(i));
}
return res;
}
public StringBuffer reverseAll(StringBuffer s) {
int left = 0;
int right = s.length() - 1;
while (left < right) {
char temp = s.charAt(left);
s.setCharAt(left, s.charAt(right));
s.setCharAt(right, temp);
left++;
right--;
}
return s;
}
public StringBuffer reverseEachWord(StringBuffer s) {
int left = 0;
for (int i = 0; i <= s.length(); i++) {
if (i == s.length() || s.charAt(i) == ' ') {
int right = i - 1;
while (left < right) {
char temp = s.charAt(left);
s.setCharAt(left, s.charAt(right));
s.setCharAt(right, temp);
left++;
right--;
}
left = i + 1;
}
}
return s;
}
}