/*
344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
*/
/*
方法一:直接双指针,遍历数组
时间复杂度O(n)
空间复杂度O(1)
*/
class Solution {
public void reverseString(char[] s) {
if (s == null || s.length == 0){
return;
}
int head = 0, end = s.length - 1;
char temp;
while (head < end){
temp = s[head];
s[head] = s[end];
s[end] = temp;
head++;
end--;
}
}
}
//方法二:位运算符交换
class Solution1 {
public void reverseString(char[] s) {
if (s == null || s.length == 0){
return;
}
int head = 0, end = s.length - 1;
while (head < end){
s[head] ^= s[end];
s[end] ^= s[head];
s[head] ^= s[end];
head++;
end--;
}
}
}
/*
541. 反转字符串 II
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
*/
/*
方法:注意循环的控制条件+双指针
*/
class Solution {
public String reverseStr(String s, int k) {
char[] arr = s.toCharArray();//把字符串转换为数组
for (int i = 0; i < arr.length; i += 2 * k) {//i每次循环增加2k
int head = i;
int end = Math.min(i + k - 1,arr.length - 1);//注意可能剩下的不够k个,注意此处取较小值
while (head < end){
arr[head] ^= arr[end];
arr[end] ^= arr[head];
arr[head] ^= arr[end];//使用异或运算交换元素
head++;
end--;
}
}
return new String(arr);//用new String() 而不用Arrays.toString()(看源码,不是要的答案)
}
}
/*
剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
*/
/*
方法一:使用StringBuffer类,对s进行遍历
时间复杂度:O(n),对数组进行遍历
空间复杂度:O(n),创建了一个StringBuffer对象
*/
class Solution {
public String replaceSpace(String s) {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) != ' '){//如果不是空格
buffer.append(s.charAt(i));//就加入对应元素
}else{
buffer.append("%20");//否则就加入指定的字段
}
}
return buffer.toString();//最后转为String输出
}
}
/*
方法二:玩一下内部库函数
*/
class Solution1 {
public String replaceSpace(String s) {
String s1 = s.replaceAll(" ", "%20");
return s1;
}
}
/*
151. 反转字符串中的单词
你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。
返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
*/
//方法一:调用Java内部的API
class Solution {
public String reverseWords(String s) {
// 除去开头和末尾的空白字符
s = s.trim();
// 正则匹配连续的空白字符作为分隔符分割
List<String> wordList = Arrays.asList(s.split("\\s+"));
Collections.reverse(wordList);//将数组反转
return String.join(" ", wordList);//使用String类的join方法
}
}
代码随想录leetcode刷题Day11-字符串
最新推荐文章于 2024-09-26 10:11:15 发布