代码随想录算法训练营|151.翻转字符串里的单词 、卡码网:55.右旋转字符串

151.翻转字符串里的单词

题目

参考文章

思路:这道题目的整体思路就是先把该字符串中首尾以及中间多余的空格去掉,首尾空格可以通过while循环判断,设置一个存储字符串的新变量,中间的多余空格则是当遇到当前位置是空格时且新变量当前位置不是空格时,把当前遇到的空格加入到新变量中否则是不加入的,这样就保证了每个单词之间就只有一个空格了;然后整体反转字符;最后反转各个单词(这里的反转可以用到第二步的反转方法)

代码:

class Solution {
     public String reverseWords(String s) {
        
        StringBuilder sb=removeSpace(s);

        reverseString(sb,0,sb.length()-1);

        reverseEachWord(sb);

        return sb.toString();
    }

    //去除多余空格
    private StringBuilder removeSpace(String s) {
        int start=0;
        int end=s.length()-1;
        while(s.charAt(start)==' ') start++;
        while(s.charAt(end)==' ') end--;
        StringBuilder sb=new StringBuilder();
        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--;
        }
    }
    
    //反转每个单词的字符
    private void reverseEachWord(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;
        }
    }
}

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

题目

参考文章

思路:这题的思路其实就是反转字符串;因为是把字符串后n个字符移到头部,所以首先我们把这个字符串分为两段来操作,一段就是 0~len-n-1,另一段是 len-n~len-1,我们现在就是把len-n~len-1这一段给移到头部。首先输入一个n和一个字符串,然后提取字符串长度,设置一个字符数组用于存储字符串转化为字符数组的元素;现在重头戏就是反转字符串,首先是先反转整个字符串,反转整个字符串后,相当于把尾部的字符移到了头部,然后就是部分反转,因为把尾部迁移到了头部,所以把前面字符反转即反转 0~n-1,然后再反转 n~len-1;最后就可以得到旋转后的正确字符串了,输出即可

代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        
        Scanner in = new Scanner(System.in);
        int n=Integer.parseInt(in.nextLine());
        String s=in.nextLine();
        int len=s.length();
        
        char[] sb=s.toCharArray();
        reverseString(sb,0,len-1);
        reverseString(sb,0,n-1);
        reverseString(sb,n,len-1);
        
        System.out.println(sb);

    }

    public static void reverseString(char[] ch, int start, int end) {
     while(start<end){
         char temp=ch[start];
         ch[start]=ch[end];
         ch[end]=temp;
         
         start++;
         end--;
         
     }
    }
}

代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第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 ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值