给定一个字符串 s 和一个整数 k,从字符串开头算起,每 2k 个字符反转前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
复制代码
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"
复制代码
- 思路:双指针
char[] chars;
public String reverseStr(String s, int k) {
int n = s.length();
chars = s.toCharArray();
StringBuilder res = new StringBuilder();
int l = 0, r = l + k;
while (r < n) {
res.append(reverse(s, l, r));
res.append(s, r, Math.min(r + k, n));
l += 2 * k;
r = l + k;
}
if (l < n) {
res.append(reverse(s, l, n));
}
return res.toString();
}
public String reverse(String s, int l, int r) {
StringBuilder sb = new StringBuilder();
for (int i = r - 1; i >= l; i--) {
sb.append(chars[i]);
}
return sb.toString();
}
复制代码
2.编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例 1:
输入:"hello"
输出:"holle"
复制代码
示例 2:
输入:"leetcode"
输出:"leotcede"
复制代码
提示:
- 元音字母不包含字母 "y" 。
思路:双指针
- 双指针 l,r 分别指向左右第一个元音字母的索引
- 跳出条件是l指向的索引是否小于r指向的索引
- 每遍历到一个元音字母
- 交换 l r
- l 右移至下一个元音字母索引位置
- r 左移至下一个原因字母索引位置
- 因为java语言限制,String类型不可变,无法直接修改字符串
- 所以空间上需要选择charArray这种类似的数据结构做交换
- 定义寻址函数findl findr
- 定义交换函数swap
- 定义check函数判断是否是原因字母check
- 第一次提交忘记了大小写的问题
public String reverseVowels(String s) {
char[] res = s.toCharArray();
int l = findl(res, 0), r = findr(res, s.length() - 1);
while (l < r) {
swap(res, l, r);
l = findl(res, l + 1);
r = findr(res, r - 1);
}
return String.valueOf(res);
}
public int findl(char[] chars, int l) {
while (l < chars.length) {
if (check(chars[l])) {
return l;
}
l++;
}
return l;
}
public int findr(char[] chars, int r) {
while (r >= 0) {
if (check(chars[r])) {
return r;
}
r--;
}
return r;
}
public void swap(char[] chars, int l, int r) {
char temp = chars[l];
chars[l] = chars[r];
chars[r] = temp;
}
public boolean check(char c) {
//大小写
//元音字母只有这五个a,e,i,o,u
c = Character.toLowerCase(c);
return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}
描述
写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)
示例1
输入:
"abcd"
复制返回值:
"dcba"
1,使用StringBuilder
使用StringBuilder,一行代码搞定
1 2 3 |
|
2,双指针
把字符串转化为数组,使用两个指针,一个在最前面一个在最后面,两个指针指向的值相互交换,交换完之后两个指针在分别往中间走……,重复上面的过程,直到两指针相遇为止
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
3,使用一个指针
使用一个指针,从后往前不断的把字符串的字符放到一个数组中,最后再把数组转化为字符串
1 2 3 4 5 6 7 |
|