LeetCode——字符串(Java)

字符串

  • 简介
  • [简单] 344. 反转字符串
  • [简单] 541. 反转字符串 II
  • [中等] 151. 反转字符串中的单词

简介

记录一下自己刷题的历程以及代码。写题过程中参考了 代码随想录。会附上一些个人的思路,如果有错误,可以在评论区提醒一下。

[简单] 344. 反转字符串

原题链接

方法①:

class Solution {public void reverseString(char[] s) {for(int i = 0; i < s.length / 2; i++){swap(s, i,s.length - 1 - i);}}private void swap(char[] s, int i, int j){char temp = s[i];s[i] = s[j];s[j] = temp;}
}

方法②:

class Solution {public void reverseString(char[] s) {int i = 0;while(i < s.length - 1 - i){swap(s, i,s.length - 1 - i);i++;}}private void swap(char[] s, int i, int j){char temp = s[i];s[i] = s[j];s[j] = temp;}
}

[简单] 541. 反转字符串 II

原题链接

一开始想到比较差的方法:就是给到一个新的StringBuilder,然后按照结果的顺序依次再加入到StringBuilder中去,时间复杂度比较高,因为对那一部分不需要转置的字符也做了处理。

public String reverseStr(String s, int k) {StringBuilder sb = new StringBuilder(s.length());int over = -1; //标记已经完成处理的下标for (int i = 0; i < s.length(); i++) {if (i - over == 2 * k) {for (int j = over + k; j > over; j--) {sb.append(s.charAt(j));}for (int j = over + k + 1; j <= over + 2 * k; j++) {sb.append(s.charAt(j));}over = over + 2 * k;}}if(s.length() - 1 - over < k){for (int j = s.length() - 1; j > over; j--) {sb.append(s.charAt(j));}}else{for (int j = over + k; j > over; j--) {sb.append(s.charAt(j));}for (int j = over + k + 1; j < s.length(); j++) {sb.append(s.charAt(j));}}return sb.toString();}

这里首先提取了反转部分的代码,看起来更清晰,同时,也避开了对不需要转换的那一部分做处理的时间复杂度,效率更高

class Solution {public String reverseStr(String s, int k) {char[] c = s.toCharArray();int i = 2 * k - 1;int n = s.length();for (; i < n; i += 2 * k) {reverse(c, i-2*k+1, i-k);}if(i-2*k+1 < n) {reverse(c, i - 2 * k + 1, n - 1 < i - k ? n - 1 : i - k);}return new String(c);}private void reverse(char[] c, int left, int right){while(left < right){char temp = c[left];c[left] = c[right];c[right] = temp;left++;right--;}}
}

[中等] 151. 反转字符串中的单词

原题链接
总共分三步:删除空格,整体反转,单词反转。
在这里插入图片描述
deleteSpace():删除空格,先是删除后置空格,删除前置空格,再删除中间的空格,因为中间的空格需要保留一个,与删除前置后置逻辑上不同
使用StringBuilder类的话需要注意:
①:delete函数的右边界end对应下标并不会被删除,比如sb.delete(5,8),删除的是5,6,7下标对应元素。
在这里插入图片描述
②:先删除前导空格的话,会导致整个字符串的所有下标都左移,不利于判断,先删除后置空格则没有这个问题。

//先删除后置再删除前置
if(r + 1 < s.length() - 1) sb = sb.delete(r + 1, s.length()); //删除后置空格
if(l > 0) sb = sb.delete(0, l); //删除前导空格

③:StringBuilder使用一个String类型构造的时候,分配的空间不完全是String本身的长度,所以在delete操作中,删除右边空格的end边界应该是String的长度边界,而不是StringBuilder的。
在这里插入图片描述

class Solution {public String reverseWords(String s) {StringBuilder sb = deleteSpace(s);sb = reverse(sb, 0, sb.length()-1);int start = 0;int i = 0;for(; i < sb.length(); i++){if(sb.charAt(i) == ' '){sb = reverse(sb, start, i - 1);start = i + 1;}}sb = reverse(sb, start, i - 1);return sb.toString();}private StringBuilder deleteSpace(String s){int l = 0;int r = s.length() - 1;while(s.charAt(l) == ' ') l++;while(s.charAt(r) == ' ') r--;StringBuilder sb = new StringBuilder(s);if(r + 1 < s.length() - 1) sb = sb.delete(r + 1, s.length()); //删除后置空格if(l > 0) sb = sb.delete(0, l); //删除前导空格int i = 0;while(i < sb.length()){if(sb.charAt(i) == ' ') {int start = ++i;while (sb.charAt(i) == ' ') i++;int end = i;if (end - start >= 0) {sb = sb.delete(start, end);i = start;}}i++;}return sb;}private StringBuilder reverse(StringBuilder sb, int l, int r){while(l < r){char temp = sb.charAt(l);sb.setCharAt(l, sb.charAt(r));sb.setCharAt(r, temp);l++;r--;}return sb;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/192052.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重生之我是一名程序员 34

哈喽啊大家晚上好&#xff01; 今天给大家带来的知识是——库函数qsort。首先&#xff0c;给大家介绍一下qsort函数&#xff0c; qsort函数是C标准库中的一种排序函数&#xff0c;用于对数组中的元素进行快速排序。它接受四个参数&#xff1a;待排序数组的基地址&#xff0c;数…

2023-2024华为ICT大赛-计算赛道-广东省省赛初赛-高职组-部分赛题分析【2023.11.18】

2023-2024华为ICT大赛 计算赛道 广东省 省赛 初赛 高职组 部分赛题 分析【2023.11.18】 文章目录 单选题tpcds模式中存在表customer&#xff0c;不能成功删除tpcds模式是&#xff08; &#xff09;以下哪个函数将圆转换成矩形&#xff08; &#xff09;下列哪个选项表示依赖该D…

TensorRt推理加速框架Python API服务器部署教程以及运行Helloworld程序

一、确认cuda工具包和n卡相关驱动是否安装 在终端中输入以下命令&#xff1a; nvcc -V如果出现以下提示&#xff0c;则已经成功安装 在终端中输入以下命令&#xff1a; nvidia-smi如果出现即为成功&#xff0c;我在这里就不去介绍怎么下载cuda和驱动怎么下载了&#xff0c;…

【Java 进阶篇】深入理解 JQuery 事件绑定:标准方式

在前端开发中&#xff0c;处理用户与页面的交互是至关重要的一部分。JQuery作为一个广泛应用的JavaScript库&#xff0c;为我们提供了简便而强大的事件绑定机制&#xff0c;使得我们能够更加灵活地响应用户的行为。本篇博客将深入解析 JQuery 的标准事件绑定方式&#xff0c;为…

LeetCode704.二分查找及二分法

每日一题&#xff1a;LeetCode704.二分查找 LeetCode704.二分查找知识点&#xff1a;二分法解题代码 LeetCode704.二分查找 问题描述&#xff1a;给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中…

公司防泄密软件科普:防止公司文件泄露的软件有什么功能?哪个好?

公司防泄密软件的主要功能是保护企业的重要文件和数据&#xff0c;以防止未经授权的访问和泄露。以下是防泄密软件的一些常见功能&#xff1a; 1、数据加密&#xff1a;防泄密软件可以使用加密算法对文件进行加密&#xff0c;使得未经授权的人无法读取或复制文件。 2、文件备份…

【Linux】基本指令

Linux现在已经是绕不开的操作系统&#xff0c;其开源导致的稳定性&#xff0c;安全性等方面遥遥领先。今天我们开始学习Linux操作系统的基本指令 ls 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于…

MySQL数据库下的Explain命令深度解析

Explain是一个非常有的命令&#xff0c;可以用来获取关于查询执行计划的信息&#xff0c;以及如何解释输出。Explain命令是查看查询优化器如何决定执行查询的主要方法。这个功能有一定的局限性&#xff0c;并不总是会说出真相&#xff0c;但是它的输出是可以获取的最好信息&…

前端Vue拖拽功能

文章目录 安装使用 直接复制粘贴即可页面使用 直接复制粘贴即可小结&#xff08;带有效果图&#xff09; 安装 提示&#xff1a;首先您需要安装它&#xff0c;命令如下&#xff1a; npm install awe-dnd --save使用 直接复制粘贴即可 在mian.js文件中引入 //main.jsimport V…

Gdevops北京站 2023年全球敏捷运维峰会-核心PPT资料下载

一、峰会简介 2023 Gdevops全球敏捷运维峰会-北京站成功举办&#xff0c;一众产学研界技术大佬与新锐专家&#xff0c;以智能为主线&#xff0c;就数据库、运维、架构、金融科技等领域进行了前沿技术与实践经验交流&#xff0c;一同畅聊AIGC、云原生、数智化转型下的新机遇。 …

AWS EC2、阿里云ECS、腾讯云CVM初步对比

作为国内外的头部云厂商&#xff0c;AWS、阿里云、腾讯云都有着相似功能的云产品&#xff0c;而作为云上最基础的资源就是云服务器——一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务。其管理方式比物理服务器更简单高效。用户无需提前购买硬件&#xff0c;即可迅速创建…

信号的机制——信号的发送与处理

对于硬件触发的&#xff0c;无论是中断&#xff0c;还是信号&#xff0c;肯定是先到内核的&#xff0c;然后内核对于中断和信号处理方式不同。一个是完全在内核里面处理完毕&#xff0c;一个是将信号放在对应的进程 task_struct 里信号相关的数据结构里面&#xff0c;然后等待进…