代码随想录算法训练营第八天|● 344.反转字符串● 541. 反转字符串II● 卡码网:54.替换数字● 151.翻转字符串里的单词● 卡码网:55.右旋转字符串

344.反转字符串

这道题一开始我还是用的老办法,什么第i个和第n-i个交换啊。但是做完以后发现这也太low了,突然就想到用双指针,并且做出来了,感觉自己确实成长了。继续坚持吧。

class Solution {
    public void reverseString(char[] s) {
        int l =0;
        int r = s.length-1;
        while(l<r){
            char temp = s[l];
            s[l] = s[r];
            s[r] = temp;
            l++;
            r--;
        }
        for(char c :s){
            System.out.print(c);
        }
    }
}

 541. 反转字符串II

int i = l;这一步很重要,你如果直接在for循环里面定义左指针l,那么你下面的while循环当中的l++会改变你的l,所以一定要分开定义,for里面是i;用于提供给l起点,还有就是对于最后几个小于2k元素的处理,你就直接判断,l+k-1大还是length-1大,如果l+k-1大,说明最后几个已经小于k了,可以直接全部反转了,如果length-1大,那么就说明最后几个大于k个,对前k个反转就行。

而且for(int i = 0;i<s.length();i+=2*k)这一步的2k也需要注意,不要想当然的i++;

class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        for(int i = 0;i<s.length();i+=2*k){
            int l = i;//这步很重要
            int r = l+k-1>s.length()-1?s.length()-1:l+k-1;

            while(l<r){
                char temp = ch[l];
                ch[l] = ch[r];
                ch[r] = temp;
                l++;
                r--;
            }
        }
        return new String(ch);
    }
}

卡码网:54.替换数字

这道题我不知道怎么判断字符是否是数字,忘了。

 151.翻转字符串里的单词

(这道题我理解了很久,5月15日到17日之间还是有些堕落。加油吧!)

总体思路是先把多余的空格处理好,然后总体反转,最后每个单词独立反转。

处理空格是先把所有的空格去掉,然后自己手动添加空格,和移除数组元素很像,都需要首先定义快指针和慢指针。

有几点需要注意:

1、reverse的函数要定义左右边界范围,这样可以重复利用

2、每个单词独立反转这块好好看,if内谁先判断谁后判断是有说法的,

3、移除空格这一部分,你一开始的数组长度和你处理完以后的数组长度并不是一样的,你一定要确定好新数组的范围,而且要定死

slow的大小即为去除多余空格后的大小。

class Solution {
    public static String reverseWords(String s) {
        char[] ch = s.toCharArray();//
        ch = removeExtraSpaces(ch);
        System.out.println(ch);
        reverse(ch,0,ch.length-1);
        int start = 0;
        for(int i = 0;i<=ch.length;i++){
            if(i == ch.length||ch[i]==' '){//这一部分谁在前谁在后太细了
                reverse(ch,start,i-1);
                start = i+1;
            }
        }
        return new String(ch);
    }
    public static char[] removeExtraSpaces(char[] ch){
        int slow = 0;
        for(int i = 0 ; i<ch.length;i++){
            if(ch[i]!=' '){
                if(slow!=0){
                    ch[slow++] = ' ';//加空格
                }
                while(i<ch.length&&ch[i]!=' '){
                    ch[slow++] = ch[i++];
                }
            }
        }
        char[] newChars = new char[slow];//这几步其实很重要,这决定了你去除空格以后数组的长度。slow的大小即为去除多余空格后的大小。
        System.arraycopy(ch, 0, newChars, 0, slow);
        return newChars;

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

● 卡码网:55.右旋转字符串

Integer.parseInt(sc.nextLine());Java --- Integer.parseInt()-CSDN博客

主要是确定好reverse的边界,起始下标和终止下标;

import java.util.Scanner;
public class Main{
   public static void main (String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = Integer.parseInt(sc.nextLine());//这行代码没见过
    String s = sc.nextLine();
    
    char[] chars = s.toCharArray();
    reverse(chars,0,chars.length-1);
    reverse(chars,0,n-1);
    reverse(chars,n,chars.length-1);
    System.out.println(chars);
    
}
public static void reverse(char[] chars,int start ,int end){
    for(;start<end;start++,end--){
        char tmp = chars[start];
        chars[start] = chars[end];
        chars[end] = tmp;
    }
} 
}

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值