344. 反转字符串541. 反转字符串 II
344. 反转字符串
题目链接 反转字符串
题目描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
思路
空间复杂度是O(1),不要额外的去申请空间,原地操作
字符串的左右分别进行交换,显而易见采用双指针法
代码
for循环
点击查看代码
class Solution {
public void reverseString(char[] s) {
int len = s.length;
for (int i = 0,j=len-1; i < s.length/2; i++,j--) {//折半交换
//进行字符交换
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
}
点击查看代码
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--;
}
}
}
总结
空间复杂度为o(1)表示所需空间为常量,并且与n无关。
O(1)是最低的时空复杂度,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。 哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的话)。
541. 反转字符串 II
题目链接
题目描述
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"
代码
点击查看代码
//时间复杂度O(n)
class Solution {
public String reverseStr(String s, int k) {
if (s.length() == 0) return null;
char[] chars = s.toCharArray();
for (int i = 0; i < s.length(); i += 2 * k) {//循环次数为n/k,时间复杂度O(n)
//满足k个,对前k个进行反转
if (i + k <= s.length()) {
reverse(chars, i, i + k);
} else {//少于k个,对剩余字符反转
reverse(chars, i, s.length());
}
}
return new String(chars);
}
//循环次数为n/2,时间复杂度O(n/2)=O(n)
public void reverse(char chars[], int l, int r) {//左闭右开
r--;
while (l < r) {
char temp;
temp = chars[l];
chars[l] = chars[r];
chars[r] = temp;
l++;
r--;
}
}
}
总结
- 将字符串转为数组:char chars = s.toCharArray();
- 将数组转为字符串进行返回:return new String(chars);
- 一般来说,自己实现的库函数遵循左闭右开原则
本文来自博客园,作者:像峰一样,转载请注明原文链接:https://www.cnblogs.com/peak-like/articles/17651737.html

刷题第10天,我与字符串
浙公网安备 33010602011771号