344.反转字符串
题目链接:344.反转字符串
参考如下代码即可,只需要保证left < right
,就能够较为简单地控制停止条件,而不必纠结于多次翻转的情况
代码如下:
class Solution {
public void reverseString(char[] s) {
int left = 0, right = s.length -1;
for (; left < right; left++, right--) {
char temp = s[left];
s[left] = s[right];
s[right] = temp;
}
}
}
541. 反转字符串II
题目链接:541. 反转字符串II
一开始的想法,是将每第2k倍数的索引记录下来,然后对其开始的k个元素进行反转,对最后剩下的元素单独处理。。。逻辑没错,事实上在for循环中可以进行次操作,只需要让每次循环结束后的变量改变值+2 * k即可。
代码如下:
class Solution {
public String reverseStr(String s, int k) {
char[] arr = s.toCharArray();
int len = arr.length;
for (int i = 0; i < len; i += 2 * k) {
//精华所在,调用min函数,可精简代码,或是加上判断,如果在字符串尾部需要单独处理
reverse(arr, i, Math.min(i + k, len) - 1);
}
return new String(arr); //字符数组 --> 字符串
}
//反转字符串函数的写法
public void reverse(char[] arr, int left, int right) {
for (; left < right; left++, right--) {
char temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
}
}
剑指Offer 05.替换空格
题目链接:剑指Offer 05.替换空格
这一题开始考虑用到StringBuilder
,在处理字符串替换,更改的操作中,StringBuilder
会很容易操作
常用几个操作:
- StringBulider append(String s) 将指定的字符串追加到此字符序列。
- StringBuffer reverse() 将此字符序列用其反转形式取代。
- int length() 返回字符序列长度
- delete(int start, int end) 移除此序列的子字符串中的字符。
注:StringBulider中没有clear()函数,如果想清空该字符序列,可使用sb.delete(0, sb.length())
- String toString() 返回此序列中数据的字符串表示形式。
另要注意,StringBuilder不能和String类型直接转换或者做 ==
比较
代码如下:
class Solution {
public String replaceSpace(String s) {
StringBuilder res = new StringBuilder();
for (char c : s.toCharArray()) {
if (c == ' ') {
res.append("%20");
} else {
res.append(c);
}
}
return res.toString();
}
}
151.翻转字符串里的单词
题目链接:151.翻转字符串里的单词
当你意识到String类型有一个方法,这道题目就变得非常easy了
- String substring(int start, int end) 返回一个新的 String,它包含此序列当前所包含的字符子序列。
两个注意点:- 返回的下标范围为
[begin, end)
substring
字母全小写,而非subString
代码如下:
- 返回的下标范围为
class Solution {
public String reverseLeftWords(String s, int n) {
return s.substring(n, s.length()) + s.substring(0, n);
}
}