代码随想录算法训练营第8天 | 344.反转字符串 ,541. 反转字符串II,剑指Offer 05.替换空格 ,151.翻转字符串里的单词 ,剑指Offer58-II.左旋转字符串 9.30
344.反转字符串
- 用双指针 再互相交换值
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--;
}
}
}
541. 反转字符串II
- 可以自己定义reverse函数 对起始和终止索引进行反转
- 模拟时,可采用2k 2k的遍历字符串 然后进行反转
- 当最后一段字符串不足k个长度时 应直接反转 因此每次满足K个时的反转完 必须加上continue进入下一层循环 以防进入接下来 反转最后不足K个的逻辑
class Solution {
public void reverse(char ch[],int i,int j){
while(i<j){
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
i++;
j--;
}
}
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i = 0; i<ch.length;i+=2*k){
if(i+k<=ch.length){
reverse(ch,i,i+k-1);
continue;
}
reverse(ch,i,ch.length-1);
}
return new String(ch);
}
}
剑指Offer 05.替换空格
- java遍历字符串常用2种方法
- toCharArray()转成字符数组遍历
- 用charAt()遍历
创建一个结果字符串往里面添加
- 因为String为不可变字符串类型 所以占用内存较大
class Solution {
public String replaceSpace(String s) {
char[] ch = s.toCharArray();
for(int i=0;i<ch.length;i++){
if(ch[i]==' '){
ch[]
}else{
res+=s.charAt(i);
}
}
return res;
}
}
- 用StringBuilder类 可以进行修改拼接等操作 节省内存
- 操作即为对数组复制 判断有空格即替换
class Solution {
public String replaceSpace(String s) {
StringBuilder res = new StringBuilder();
for(int i=0;i<s.length();i++){
if(s.charAt(i)==' '){
res.append("%20");
}else{
res.append(s.charAt(i));
}
}
return res.toString();
}
}
151.翻转字符串里的单词
- 不使用库函数 空间复杂度为o(1)
- 先去除首尾即中间的多余空格
- 反转整个字符串
- 反转每个单词
- 通过自己写方法实现
- 删除空格操作类似之前数组中移除元素 可以用双指针 快指针用来获取新的元素 慢指针指向新数组末尾位置
- 遇到非空格才处理 即删除所有空格
- 除了第一个单词 后面的单词前面都有空格 所以当slow!=0 手动给每个单词前添加空格
- 当fast<长度 并且不等于空格时 给slow添加单词
- 但是在java中String无法进行数组操作
- 删除首尾空格 创建一个StringBuilder类 来接删除空格后的字符串 首先删除首尾空格用while + 判断
- 创建removeSpace方法 删除中间多余空格时 判断当前新字符串最后一位是否有空格 || 当前原字符串是否有单词 然后append
- 创建reverseString方法 左闭右闭区间内反转字符串 用两端相向双指针实现交换
- 创建reverseWord方法 用双指针确定每个单词的首尾位置 调用reverseString方法 反转 end位置即为空格前一个(因为左闭右闭)区间
class Solution {
public String reverseWords(String s) {
StringBuilder sb = removeSpace(s);
reverseString(sb,0,sb.length()-1);
reverseWord(sb);
return sb.toString();
}
public StringBuilder removeSpace(String s){
StringBuilder sb = new StringBuilder();
int start = 0;
int end = s.length()-1;
while(s.charAt(start)==' '){
start++;
}
while(s.charAt(end)==' '){
end--;
}
while(start<=end){
char c = s.charAt(start);
if(c!=' ' || sb.charAt(sb.length()-1)!=' '){
sb.append(c);
}
start++;
}
return sb;
}
public void reverseString(StringBuilder sb,int start,int end){
while(start<end){
char temp = sb.charAt(start);
sb.setCharAt(start,sb.charAt(end));
sb.setCharAt(end,temp);
start++;
end--;
}
}
public void reverseWord(StringBuilder sb){
int start = 0;
int end = 1;
int n = sb.length();
while(start<n){
while(end<n && sb.charAt(end)!=' '){
end++;
}
reverseString(sb,start,end-1);
start = end+1;
end = start+1;
}
}
}
剑指Offer58-II.左旋转字符串
- 整体反转+局部反转 定义reverse方法实现
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder sb = new StringBuilder(s);
int len = sb.length();
reverseString(sb,0,len-1);
reverseString(sb,0,len-1-n);
reverseString(sb,len-n,len-1);
return sb.toString();
}
public StringBuilder reverseString(StringBuilder sb,int start,int end){
while(start<end){
char temp = sb.charAt(start);
sb.setCharAt(start,sb.charAt(end));
sb.setCharAt(end,temp);
start++;
end--;
}
return sb;
}
}