基础知识

  1. // String -> char[]
  2. char[] string=s.toCharArray();
  3. // char[] -> String
  4. String.valueOf(string)

注意replace replaceAll区别,都是全局匹配替换,不过replaceAll是正则匹配

LeetCode 344.反转字符串

分析1.0

基础的前后指针元素互换

  1. class Solution {
  2. public void reverseString(char[] s) {
  3. if(s==null){
  4. return;
  5. }
  6. int len=s.length;
  7. if(len==0 || len==1){
  8. return;
  9. }
  10. int left=0, right=len-1;
  11. while(left<right){
  12. char temp=s[right];
  13. s[right]=s[left];
  14. s[left]=temp;
  15. left++;
  16. right--;
  17. }
  18. return;
  19. }
  20. }

LeetCode 541. 反转字符串II

分析1.0

涉及多次反转,考虑写一个根据索引反转字符串的函数,反转部分之后,考虑剩下的元素个数;

String -> StringBuilder 或者采用字符数组的方式处理

  1. class Solution {
  2. public String reverseStr(String s, int k) {
  3. int len=s.length();
  4. if(s==null){
  5. return null;
  6. }
  7. char[] string=s.toCharArray();
  8. int endIndex=len-1;
  9. int startIndex=0;
  10. while(startIndex<=endIndex){
  11. //System.out.println("start position: "+startIndex);
  12. int gap=endIndex-startIndex+1;
  13. //System.out.println("gap: "+gap);
  14. if(gap<k){
  15. reverse(string, startIndex, endIndex);
  16. break;
  17. }else if(gap<2*k && gap>=k){
  18. reverse(string, startIndex, startIndex+k-1);
  19. break;
  20. }else{
  21. reverse(string, startIndex, startIndex+k-1);
  22. startIndex=startIndex+2*k;
  23. }
  24. //System.out.println(string);
  25. }
  26. return String.valueOf(string);
  27. }
  28. public void reverse(char[] s, int left, int right){
  29. while(left<right){
  30. char temp=s[left];
  31. s[left]=s[right];
  32. s[right]=temp;
  33. left++;
  34. right--;
  35. }
  36. }
  37. }

LeetCode

分析1.0

直接用了API 

  1. class Solution {
  2. public String replaceSpace(String s) {
  3. return s.replace(" ","%20");
  4. }
  5. }

LeetCode 151.翻转字符串里的单词

分析1.0

遍历,遍历过程中去除多余空格,将获得的一个一个单词采用尾插法加入List<StringBuilder>,最后再使用空格拼接

获取单词首指针、检查合法性、获取尾指针 

  1. class Solution {
  2. public String reverseWords(String s) {
  3. if(s==null){
  4. return null;
  5. }
  6. // s=s.trim();
  7. ArrayDeque<String> stack = new ArrayDeque();
  8. int len=s.length();
  9. int leftIndex=0, rightIndex=0;
  10. while(leftIndex<len){
  11. // 获取s中每个单词的起始索引
  12. while(leftIndex<len && s.charAt(leftIndex)==' '){
  13. leftIndex++;
  14. }
  15. // 这里要注意跳出
  16. if(leftIndex>=len){
  17. break;
  18. }
  19. rightIndex=leftIndex;
  20. while(rightIndex<len && s.charAt(rightIndex)!=' '){
  21. rightIndex++;
  22. }// 此时rightIndex指向某个单词的最后一个字符的索引的后面的空格
  23. String temp=s.substring(leftIndex, rightIndex);
  24. System.out.println("----"+temp);
  25. stack.push(temp);
  26. leftIndex=rightIndex;
  27. }
  28. StringBuilder ans = new StringBuilder();
  29. while(!stack.isEmpty()){
  30. ans.append(stack.pop())
  31. .append(" ");
  32. }
  33. // return ans.toString().trim(); 二者都行
  34. return ans.substring(0, ans.length()-1);
  35. }
  36. }

失误

每次获取一个单词前都要检查当前额left指针是否超过了s的长度

substring() 要小写 subString()是错的

分析2.0

反转s,再反转所有的单词

采用trim()方法去除收尾多余空格,再用replaceAll()

LeetCode 剑指Offer58-II.左旋转字符串

分析1.0

相当于逻辑左移所有字符串元素,左移个数如果是元素个数的倍数,那就不移动,即要将移动次数对字符串长度取余,再向左移动,增加字符串空间,取余后的索引为n的元素为新的首元素,将原字符串截断后拼接即可

  1. class Solution {
  2. public String reverseLeftWords(String s, int n) {
  3. int len=s.length();
  4. n=n%len;
  5. String s1=s.substring(0,n);
  6. String s2=s.substring(n,len);
  7. return s2+s1;
  8. }
  9. }

分析2.0

反转两个局部,再整体反转

总结

  1. 数组长度 arr.length 字符串长度 s.length()
  2. 双指针-前后指针、快慢指针、滑动窗口 降低时间复杂度利器
  3. 工具:Arrays、Collections、队列、栈(逆序好帮手)、哈希表/map 
  4. substring() 要小写 subString()是错的
  5. s.trim().replaceAll("\\s+", " ") 去除收尾多余空格并将字符串内多余空格变成一个空格

常用变量名增量更新

size、val、ans、cnt、cur、pre、next、left、right、index、gap、tar、res、src、len、start、end

代码随想录算法训练营day08 | leetcode 344.反转字符串/541. 反转字符串II / 剑指Offer05.替换空格/151.翻转字符串里的单词/剑指Offer58-II.左旋转字符串的更多相关文章

  1. 【算法训练营day8】LeetCode344. 反转字符串 LeetCode541. 反转字符串II 剑指Offer05. 替换空格 LeetCode151. 翻转字符串里的单词 剑指Offer58-II. 左旋转字符串

    [算法训练营day8]LeetCode344. 反转字符串 LeetCode541. 反转字符串II 剑指Offer05. 替换空格 LeetCode151. 翻转字符串里的单词 剑指Offer58- ...

  2. 代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串

    第一题344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这 ...

  3. Leetcode 344:Reverse String 反转字符串(python、java)

    Leetcode 344:Reverse String 反转字符串 公众号:爱写bug Write a function that reverses a string. The input strin ...

  4. 笔试算法题(13):反转链表 & 左旋转字符串

    出题:反转链表(递归和非递归解法): 分析:有递归跟非递归实现,注意对原始链表头节点的处理,因为其他节点都指向下一个节点,其需要指向NULL: 解题: struct Node { int v; Nod ...

  5. 编程算法 - 左旋转字符串 代码(C)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/37689725 左旋转字符串 代码(C) 本文 ...

  6. 九度OJ 1362 左旋转字符串(Move!Move!!Move!!!)【算法】

    题目地址:http://ac.jobdu.com/problem.php?pid=1362 题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运 ...

  7. leetcode题库练习_左旋转字符串

    题目:左旋转字符串 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"abcdefg"和数字2,该函数将返 ...

  8. Leetcode#344. Reverse String(反转字符串)

    题目描述 编写一个函数,其作用是将输入的字符串反转过来. 示例 1: 输入: "hello" 输出: "olleh" 示例 2: 输入: "A man ...

  9. 【LeetCode】151. 翻转字符串里的单词(剑指offer 58-I)

    151. 翻转字符串里的单词 知识点:字符串:双指针 题目描述 给你一个字符串 s ,逐个翻转字符串中的所有 单词 . 单词 是由非空格字符组成的字符串.s 中使用至少一个空格将字符串中的 单词 分隔 ...

  10. [LeetCode] 344 Reverse String && 541 Reverse String II

    原题地址: 344 Reverse String: https://leetcode.com/problems/reverse-string/description/ 541 Reverse Stri ...

随机推荐

  1. 【Java SE】Day08 String类、static关键字、Arrays类、Math类

    一.String类 1.概述 所有双引号字符串,都是String类的对象 字符串常量,会存在字符串常量池中 2.创建 构造函数--空构造.字符数组.字节(byte ASCII码)数组 3.常用方法-- ...

  2. Java开发学习(四十八)----MyBatisPlus删除语句之逻辑删除

    1.逻辑删除 接下来要讲解是删除中比较重要的一个操作,逻辑删除,先来分析下问题: 这是一个员工和其所签的合同表,关系是一个员工可以签多个合同,是一个一(员工)对多(合同)的表 员工ID为1的张业绩,总 ...

  3. 项目完成小结 - Django-React-Docker-Swag部署配置

    前言 最近有个项目到一段落,做个小结记录. 内容可能会多次补充,在博客上实时更新哈~ 如果是在公众号阅读这篇文章,可以点击「查看原文」访问最新版本~ 这个项目是前后端分离,后端为了快,依然用我的Dja ...

  4. 我做了第一个ChatGPT .net api聊天库

    最近这个ChatGPT很火啊,看了B站上很多视频,自己非常手痒,高低自己得整一个啊,但是让我很难受的是,翻遍了github前十页,竟然没有一个C#的ChatGPT项目,我好难受啊!那能怎么办?自己搞一 ...

  5. redis集合 实现 队列

    先说一下需求:用队列解决 流量削峰,主要应用场景:商城秒杀功能. 以下是业务流程图可以参考一下: 然后本地实现思路 截图下单页面 每次购买数量会减少1,设置了1000个库存,用户id 是随机生成的. ...

  6. 模板层之标签 自定义过滤器及标签 模板的继承与导入 模型层之前期准备 ORM常用关键字

    目录 模板层之标签 if判断 for循环 自定义过滤器.标签及inclusion_tag(了解) 前期三步骤 自定义过滤器(最大只能接收两个参数) 自定义标签(参数没有限制) 自定义inclusion ...

  7. 模仿 vscode-server 把本地代码目录映射到外网

    目录 概述 分析 解决方案 准备一台VM 创建容器 SmartIDE 创建 直接使用 docker 创建 SSH 远程转发 内网穿透 ngrok frp 服务端 客户端 本文模仿 vscode-ser ...

  8. asp前端无法获取后端中select *查询带出来的全部字段

    1.环境 前端:ASP.vbscript 后端:vb 数据库:Sql Server 2.问题描述 最近在做需求时碰到一个很奇怪的问题,后端通过select *查询带出来的字段,在前端只能获取到部分字段 ...

  9. [常用工具] OpenCV_contrib库在windows下编译使用指南

    本文主要讲述opencv及opencv_contrib库在windows下基于vs2017编译安装指南.所用OpenCV版本为OpenCV4.4,编译平台为vs2017. 文章目录 1 下载 2 编译 ...

  10. BBS升级版

    BBS项目 项目的前期准备 1.django2.2 创建一个django目录 (需要配置环境变量和数据库) 'DIRS': [os.path.join(BASE_DIR, 'templates'), ...