• Leetcode刷题Day8-------------字符串


    Leetcode刷题Day8-------------字符串

    1. 反转字符串 (344)
    • 题目链接:
    • 文章讲解/视频讲解:https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html

    双指针 或者 for+单指针 都可

    class Solution {
        public void reverseString(char[] s) {
            int right=s.length-1;
            for(int i=0;i<s.length/2;i++){
                char temp=s[i];
                s[i]=s[right];
                s[right]=temp;
                right--;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    2. 反转字符串II (541)
    • 题目链接:https://leetcode.cn/problems/reverse-string-ii/
    • 文章讲解/视频讲解:https://programmercarl.com/0541.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2II.html
      重点:
    1. 题目要求每次只翻转k个,然后k个不翻转,这样为一轮---------------->一轮有2k个,所以用for循环来控制
    2. 题目要求如果最后一轮的一半不到k个,就都翻转,如果够K个就反转k个----------->right 的判定:Math.min(ch.length - 1, start + k - 1);
    3. 库函数:s为 String类型-------> char[] ch = s.toCharArray();
    //解法二(似乎更容易理解点)
    //题目的意思其实概括为 每隔2k个反转前k个,尾数不够k个时候全部反转
    class Solution {
        public String reverseStr(String s, int k) {
            char[] ch = s.toCharArray();
            for(int i = 0; i < ch.length; i += 2 * k){
                
    			//以下与上题道理相同
                //这里是判断尾数够不够k个来取决end指针的位置
                int right=Math.min(ch.length-1,i+k-1);
                for(int j=i;j<right;j++){
                    char temp=ch[j];
                    ch[j]=ch[right];
                    ch[right]=temp;
                    right--;
                }
            }
            return new String(ch);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    3. 替换空格 (剑指Offer 05)
    • 题目链接/文章讲解:https://programmercarl.com/%E5%89%91%E6%8C%87Offer05.%E6%9B%BF%E6%8D%A2%E7%A9%BA%E6%A0%BC.html

    重点:
    转为StringBuilder 追加

    class Solution {
        public String replaceSpace(String s) {
            StringBuilder sb=new StringBuilder();
            for(int i=0;i<s.length();i++){
                if(s.charAt(i)==' ') sb.append("%20");
                else sb.append(s.charAt(i));
            }
            return sb.toString();
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    4. 翻转字符串里的单词(151)
    • 题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/
    • 文章讲解/视频讲解:https://programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html
    5. 左旋转字符串 (剑指Offer58-II)
    • 题目链接:
    • 文章讲解:https://programmercarl.com/%E5%89%91%E6%8C%87Offer58-II.%E5%B7%A6%E6%97%8B%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html

    还是 整体旋转+局部旋转!
    步骤

    1. 反转区间为前n的子串
    2. 反转区间为n到末尾的子串
    3. 反转整个字符串

    注意:处理好调用时的参数-----------> 需要-1,因为含头含尾

    class Solution {
        public String reverseLeftWords(String s, int n) {
            s=reversString(s,0,n-1);
            s=reversString(s, n, s.length()-1);
            s=reversString(s,0,s.length()-1);
            return s;
        }
    
        public String reversString(String s, int start, int end){
            char[] ch=s.toCharArray();
            for(int i=start;i<end;i++){
                char temp=ch[i];
                ch[i]=ch[end];
                ch[end]=temp;
                end--;
            }
            return new String(ch);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    C++中string的用法总结+底层剖析
    关于git 解决分支冲突问题(具体操作,包含截图,教你一步一步解决冲突问题)
    Golang 并发编程
    平面设计实验三 手机海报与选区操作
    拼多多anti-token 字段加解密学习分析
    Java Double compare()方法具有什么功能呢?
    x86_64汇编指令 cqto & idivq
    TSINGSEE青犀智能分析网关工服识别算法,如何最大限度保障工人安全?
    JavaWeb 学习笔记 7:Filter
    vue.js中slot插槽的作用
  • 原文地址:https://blog.csdn.net/qq_43563187/article/details/128067529