持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
一、题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:
输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
提示:
- 1 <= s.length <= 10^5
- s[i] 都是 ASCII 码表中的可打印字符
二、思路分析:
反转字符串,设置两个指针,一个开始,一个结束,当数组的长度为0的时候,返回空数组,不为0的额时候,当开始的指针小于结束的指针时候,开始遍历,交换两侧的数组值。 注:之所以要length-1 是因为,数组的索引值是从0开始的,而length长度是从1开始计算的,长度减1就是索引值了。不减去1的话,数组的索引值长度大于实际长度,数组最后一个将是undefined
三、AC:
class Solution {
public String reverseStr(String s, int k) {
char[] a = s.toCharArray();
for (int start = 0; start < a.length; start += 2 * k) { //每2k个就进行判断
int i = start; //确定开始位置
//确定反转边界,若剩余字符大于k,则j = start + k - 1,反转前k个
//小于k时,start再加k减一就会大于或等于字符串长度-1,则此时j = a.length - 1,剩余字符全部反转
int j = Math.min(start + k - 1, a.length - 1);
while (i < j) {
char tmp = a[i];
a[i++] = a[j];
a[j--] = tmp;
}
}
return new String(a);
}
}