代码随想录刷题Day10

81 阅读2分钟

字符串

  1. 344. 反转字符串
class Solution {
    public void reverseString(char[] s) {
        int left=0,right=s.length-1;
        while(left<right){
            char ch = s[left];
            s[left]=s[right];
            s[right]=ch;
            left++;
            right--;
        }
    }
}
  1. 541. 反转字符串 II
class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        for(int i=0;i<ch.length;i+=2*k){
            int l=i;
            // 判断尾数够不够k个来取决end指针的位置
            int r = Math.min(ch.length - 1,l+ k - 1);
            while(l<r){
                char tmp = ch[l];
                ch[l]=ch[r];
                ch[r]=tmp;
                l++;
                r--;
            }
        }
        String res=new String(ch);
        return res;
    }
}
  1. LCR 122. 路径加密
  • 方法1:数组替换
class Solution {
    public String pathEncryption(String path) {
        char[] ch = path.toCharArray();
        for(int i=0;i<ch.length;i++){
            if(ch[i]=='.'){
                ch[i]=' ';
            }
        }
        return new String(ch);
    }
}
  • 方法2:数组复制
class Solution {
    public String pathEncryption(String path) {
        //选用 StringBuilder 单线程使用,比较快,选不选都行
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<path.length();i++){
            if(path.charAt(i)=='.'){
                sb.append(' ');
            }else{
                sb.append(path.charAt(i));
            }
        }
        return sb.toString();
    }
}
  • 方法3:库函数
class Solution {
    public String pathEncryption(String path) {
       return path.replace('.',' ');
    }
}

方法4:双指针

programmercarl.com/%E5%89%91%E…

本题题目改了,所以用双指针不需要再扩充内存。我自己改后的代码也在下面

class Solution {
    public String pathEncryption(String path) {
        //定义扩充空间,本题这一步可以不用
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<path.length();i++){
            if(path.charAt(i)=='.'){
                // sb.append(' ');
            }
        }
        //双指针法,左指针指向原数组的最后,右指针指向扩展数组的最后
        int left=path.length()-1;
        path+=sb.toString();
        int right=path.length()-1;
        char[] ch = path.toCharArray();
        while(left>=0){
            if(ch[left]=='.'){
                ch[right]=' ';
            }else{
                ch[right]=ch[left];
            }
            left--;
            right--;
        }
        String res=new String(ch);
        return res;
    }
}
  1. 151. 反转字符串中的单词
  • 双指针,自己想的

快慢指针都指向终点,快指针向前走,找到空格则把单词记到res中,慢指针指向left-1。再继续走直到快指针走完字符串

注意点:1、为了方便可以先删除首尾空格;2、连续空格的处理比较细节;3、按照我的思路最后一个单词会被省略所以要处理一下

class Solution {
    public String reverseWords(String s) {
        s = s.trim(); //删除首尾空格
        int left=s.length()-1;//快指针
        int right=s.length()-1;//慢指针
        String res = new String();
        char[] ch=s.toCharArray();
        while(left>=0){
            int flag=0;
            if(ch[left]==' '){
                for(int i=left+1;i<=right;i++){
                    if(ch[i]!=' '){//跳过连续空格
                        res+=ch[i];
                        flag=1;
                    } 
                }
                if(flag==1){
                    res+=' ';
                }
                right=left-1;
            }
            left--;
            if(left==-1&&ch[0]!=' '){//记录最后一个单词
                for(int i=left+1;i<=right;i++){
                    res+=ch[i];
                }
            }
        }
        return res;
    }
}
  • 双指针优化

自己的思路有点复杂。

leetcode.cn/problems/re… 大神写的更简单。先用快指针找到空格,再添加单词和空格,中间遇到连续空格则跳过,慢指针指向下个单词尾。

    public String reverseWords(String s) {
        s = s.trim(); //删除首尾空格
        int left=s.length()-1;//快指针
        int right=s.length()-1;//慢指针
        StringBuilder res = new StringBuilder();
        while(left>=0){
            while(left >= 0 && s.charAt(left)!=' ') left--;//搜索到空格
            res.append(s.substring(left+1,right+1)+' ');//添加单词和空格
            while(left >= 0 && s.charAt(left)==' ') left--;//跳过单词间空格
            right=left;//right指向下个单词尾 
        }
        return res.toString().trim();
    }
}