当前位置: 首页 > article >正文

代码随想录算法训练营|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--;
         
     }
    }
}


http://www.kler.cn/news/315176.html

相关文章:

  • 分布式Redis(14)哈希槽
  • 深入理解Go并发编程:避免Goroutine泄漏与错误处理
  • C++_数据封装详解
  • 综述论文“Towards Personalized Federated Learning”分享
  • 研究生第一次刷力扣day1
  • 认识结构体
  • Docker笔记-Docker Dockerfile
  • 语言模型的在线策略提炼:从自我错误中学习
  • Redis数据结构之set
  • 音视频入门基础:AAC专题(8)——FFmpeg源码中计算AAC裸流AVStream的time_base的实现
  • Qt:静态局部变量实现单例(附带单例使用和内存管理)
  • socket是什么?为什么要用socket?
  • Python 实现图形学几何变换算法
  • 【农信网-注册/登录安全分析报告】
  • (done) 声音信号处理基础知识(5) (Types of Audio Features for Machine Learning)
  • 【Pycharm】Pycharm创建Django提示pip版本需要升级
  • WebLogic 靶场攻略
  • JavaEE: 深入探索TCP网络编程的奇妙世界(二)
  • OpenCL 学习(2)---- OpenCL Platform 和 Device
  • Linux进阶命令-rsync daemon
  • Java :数组array和 Arrays
  • Phoenix使用
  • Zookeeper安装使用教程
  • 爬虫技术抓取网站数据
  • C++进阶|多态知识点详解及经典面试题总结
  • 字节跳动冯佳时:大语言模型在计算机视觉领域的应用、问题和我们的解法
  • java实现系统文件管理
  • 如何在自动化测试中应用装饰器、多线程优化自动化架构?
  • ConflictingBeanDefinitionException | 运行SpringBoot项目时报错bean定义冲突解决方案
  • 音视频入门基础:AAC专题(5)——FFmpeg源码中,判断某文件是否为AAC裸流文件的实现