代码随想录算法训练营day08|344反转字符串|541反转字符串2|05替换空格|151翻转字符串里的单词

344.反转字符串

力扣题目链接 (opens new window)

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:
输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]

示例 2:
输入:[“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]

思路:

常见的交换数值

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

力扣题目链接 (opens new window)

给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。

如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例 2:

输入:s = "abcd", k = 2
输出:"bacd"

思路

遍历的时候,每次让i移动i+2k

再判断是否有要反转的区间 i+k<=ch.length

class Solution {
    public String reverseStr(String s, int k) {
        char[] ch=s.toCharArray();
        for(int i=0;i<ch.length;i=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);

    }
    public void reverse(char[] s,int i,int j){
        for(;i<j;i++,j--){
            char temp=s[i];
            s[i]=s[j];
            s[j]=temp;
        }
    }
}

剑指Offer 05.替换空格

力扣题目链接 (opens new window)

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1: 输入:s = “We are happy.”
输出:“We%20are%20happy.”

思路:

双指针法

1.扩容

2.i指向新长度的末尾,j指向旧长度的末尾

class Solution {
    public String replaceSpace(String s) {
        if(s==null||s.length()==0){
            return s;
        }
        //扩容
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)==' '){
                sb.append("  ");
            }
        }
        
        int fast=s.length()-1;
        s=s+sb.toString();
        int slow=s.length()-1;
        char[] ch=s.toCharArray();
        while(fast>=0){
            if(ch[fast]==' '){
                ch[slow]='0';
                slow--;
                ch[slow]='2';
                slow--;
                ch[slow]='%';
            }else{
                ch[slow]=ch[fast];
            }
            fast--;
            slow--;
        }
        return new String(ch);
    }
}
//空间复杂度O(n)

151.翻转字符串里的单词

力扣题目链接 (opens new window)

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = “the sky is blue”
输出:“blue is sky the”

示例 2:

输入:s = " hello world "
输出:“world hello”
解释:反转后的字符串中不能存在前导空格和尾随空格。

示例 3:

输入:s = “a good example”
输出:“example good a”
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

思路

1.先移除多余空格

//先用 fast 移除所有空格

//在用 slow 加空格。 除第一个单词外,单词末尾要加空格

//fast 遇到空格或遍历到字符串末尾,就证明遍历完一个单词了

2.将整个字符串反转

参考344反转字符串

3.最后把单词逐个反转

class Solution {
    public String reverseWords(String s) {
        char[] ch=s.toCharArray();
        ch=removeExtraSpaces(ch);
        reverse(ch,0,ch.length-1);
        reverseWord(ch);
        return new String(ch);
    }
    //删除空格
    public char[] removeExtraSpaces(char[] ch){
        int slow=0;
        for(int fast=0;fast<ch.length;fast++){
            if(ch[fast]!=' '){
                if(slow!=0){
                    ch[slow]= ' ';
                    slow++;
                }
                while(fast<ch.length&&ch[fast]!=' '){
                    ch[slow]=ch[fast];
                    slow++;
                    fast++;
                }
            }
        }
        char[] newChar=new char[slow];
        System.arraycopy(ch,0,newChar,0,slow);
        return newChar;
    }
    //双指针实现字符串反转
    public void reverse(char[] ch,int left,int right){       
        while(left<right){
            char temp=ch[left];
            ch[left]=ch[right];
            ch[right]=temp;
            left++;
            right--; 
        }
    }
    //单词反转
    public void reverseWord(char[] ch){
        int start=0;
        for(int end=0;end<=ch.length;end++){
            if(end==ch.length||ch[end]==' '){
                reverse(ch,start,end-1);
                start=end+1;
            }
        }
    }
}
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值