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

算法通关村——字符串反转问题解析

1. 反转字符串

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

1.1 交换

这一题的思路还是简单的,就是将左边的元素和右边的元素交换位置,即可原地修改数组。
在这里插入图片描述

    public void reverseString(char[] s) {if(s.length == 0 || s == null){return ;}for(int left =0, right=s.length-1;  left<right; left++,right--){char swap = s[left];s[left]=s[right];s[right]=swap;}}

2. 反转字符串 II

反转字符串
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

2.1 反转

这个题目的叙述有点难以理解,总结就是每个K个就反转前k个,如果剩余长度不能k,那么将剩余元素都反转。

示例 1:
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”

k=2,2k=4,反转ab 变成bacdefg
剩余3,k<3<2k, 反转ef 变成bacdfeg

反转每个下标从2k开始的

 public String reverseStr(String s, int k) {int length = s.length();char [] chars = s.toCharArray();for(int i=0;i<length;i+=2*k){swap(i,Math.min(i+k,length)-1,chars);}return new String(chars);}public void swap(int start,int end,char [] chars){while(start<end){char temp = chars[start];chars[start] = chars[end];chars[end] = temp;start++;end--;}}

3. 仅仅反转字母

仅反转字母
给你一个字符串 s ,根据下述规则反转字符串:

所有非英文字母保留在原有位置。
所有英文字母(小写或大写)位置反转。
返回反转后的 s 。

示例 1:

输入:s = “ab-cd”
输出:“dc-ba”

3.1 反转

这个题目如果不看-符号,就是一个普通的字符交换,但是多了一个字符,只需要每次遇到这个字符的时候就跳过这个字符就可以,其余的交换依然一样。

 public String reverseOnlyLetters(String s) {char [] arr = s.toCharArray();int left = 0;int right = s.length()-1;while(left<right){while(left<right && !Character.isLetter(arr[left])){left++;}while(left<right && !Character.isLetter(arr[right])){right--;}char temp = arr[left];arr[left] = arr[right];arr[right] = temp;left++;right--;}return new String(arr);}

这一题一开始没看全就就认为字符是-,但是1,!这些也都是字符所以需要使用Character.isLetter()判断是否为字符。

3.2 栈

当然这一题还可以使用栈来存储里面的英文,然后遍历字符串,栈里面元素出来的顺序就是逆序的,然后和字符串比较,如果不是英文字母,那么就添加这个字符,否则就添加出栈元素。

    public String reverseOnlyLetters(String s) {char [] arr = s.toCharArray();Stack<Character> stack = new Stack<>();for(char c : arr){if(Character.isLetter(c)){stack.push(c);}}StringBuilder sb = new StringBuilder();for(char c:arr){if(Character.isLetter(c)){sb.append(stack.pop());}else{sb.append(c);}}return sb.toString();}

在这里插入图片描述
但是很显然,这种方式速度方面不怎么行,但是也是易于理解的。

4. 反转字符串中的单词

反转字符串中的单词
给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

4.1 调用API

可以使用正则匹配来将字符串分组,然后从后遍历字符串数组,将其添加到stringbuilder里面去,每一次添加都需要额外添加一个空格。

  public String reverseWords(String s) {String [] words = s.trim().split("\\s+");StringBuilder sb = new StringBuilder();for(int i = words.length-1;i>=0;i--){sb.append(words[i]);if(i>0){sb.append(" ");}}return sb.toString();}

虽然说这个方式很容易想到,但是实际面试里面不会这么写,而是手动进行切割。

4.2 自定义

总体思路就是,使用两个指针start,end,然后逆序遍历字符串,end就是当前单词末尾位置,start就是当前单词的开始位置,然后再次遍历这个start-end位置的元素添加至stringbuilder里面,添加一个空白。

    public String reverseWords(String s) {int start,end;StringBuilder sb = new StringBuilder();for(int i=s.length()-1;i>=0;i--){// 最后一个元素是哦空格,跳过if(s.charAt(i)  == ' '){ continue;}// 单词结束位置end = i+1;// 获取单词第一个位置while(i>=0 && s.charAt(i)!=' '){i--;}start = i+1;// 添加单词for(int j=start;j<end;j++){sb.append(s.charAt(j));}sb.append(' ');}// 删除最后一个空格sb.deleteCharAt(sb.length()-1);return sb.toString();}

在这里插入图片描述

官方的解法较为复杂。

相关文章:

算法通关村——字符串反转问题解析

1. 反转字符串 反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 1.1 交换 这一题的思路还是简单的&…...

vue + elementui 中 在弹框中使用了 tree型结构(<el-tree></el-tree>),点击关闭按钮按钮重置tree

vue 项目中使用了element-ui 中 tree&#xff0c;选择了懒加载的模式 通过点击按钮&#xff0c;使得 tree 重新加载 <div class"head-container header-tree" v-if"addDialogVisible"><el-treeref"tree":data"treeData":loa…...

windows adb根据id点击按钮

在 Windows 上使用 adb 根据控件的 ID 来模拟点击按钮&#xff0c;可以使用以下命令&#xff1a; 查看当前屏幕上的所有控件信息&#xff0c;并将其保存到文件中&#xff1a; adb shell uiautomator dump /sdcard/ui.xml 将设备上的 ui.xml 文件下载到计算机上&#xff1a; ad…...

netty(一):NIO——处理消息边界

处理消息边界 为什么要处理边界 因为会存在半包和粘包的问题 1.客户端和服务端约定一个固定长度 优点&#xff1a;简单 缺点&#xff1a;可能造成浪费 2.客户端与服务端约定一个固定分割符 *缺点 效率低 3.先发送长度&#xff0c;再发送数据 TLV格式&#xff1a; type…...

等保测评--安全计算环境--测评方法

安全子类--身份鉴别 a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换; 一、测评对象 终端和服务器等设备中的操作系统(包括宿主机和虚拟机操作系统) 、网络设备(包括虚拟网络设备)、安全设备(包括虚拟安全设备)、移动终端…...

open cv学习 (二)色彩空间和通道

色彩空间和通道 demo1 import cv2hsv_image cv2.imread("./img.png")cv2.imshow("img", hsv_image) hsv_image cv2.cvtColor(hsv_image, cv2.COLOR_BGR2HSV) h, s, v cv2.split(hsv_image) cv2.imshow("B", h) cv2.imshow("G", s…...

RS232、RS422、RS485硬件及RS指令、RS2指令应用知识学习

RS232、RS422、RS485硬件及RS指令、RS2指令应用知识学习 一、串行&#xff08;异步/同步)通讯、并行通讯、以太网通讯 二、单工通讯/半双工通讯/双工通讯 三、常用硬件接口&#xff08;工业上基本是RS485两线制的接线&#xff09; 常用硬件接口RS232/RS422/RS485&#xff0c;…...

背景属性样式

&#x1f353;背景属性 属性名称中文注释备注background-image背景图片url(img-path)background-color背景颜色background-attachment设置背景固定scroll默认值&#xff0c;随盒子滚动&#xff0c; fixed固定&#xff0c;脱离标准流&#xff0c;固定在浏览器窗口&#xff0c;当…...

蓝桥杯每日N题 (消灭老鼠)

大家好 我是寸铁 希望这篇题解对你有用&#xff0c;麻烦动动手指点个赞或关注&#xff0c;感谢您的关注 不清楚蓝桥杯考什么的点点下方&#x1f447; 考点秘籍 想背纯享模版的伙伴们点点下方&#x1f447; 蓝桥杯省一你一定不能错过的模板大全(第一期) 蓝桥杯省一你一定不…...

k8s 用户角色 权限的划分

在Kubernetes中&#xff0c;角色&#xff08;Role&#xff09;和角色绑定&#xff08;RoleBinding&#xff09;用于划分用户的权限。 Kubernetes中的角色定义了一组特定操作的权限&#xff0c;例如 创建、删除或修改特定资源。而 角色绑定则将角色与用户、组或服务账号进行关联…...

聊一下操作系统 macOS 与 Linux

对于Windows操作系统大家都比较熟悉&#xff0c;也常拿它与Linux操作系统进行比较&#xff0c;两者之间的差异也很明显。但对于macOS 和 Linux的比较不太多&#xff0c;很多人认为它们很相似&#xff0c;因为这两种操作系统都可以运行 Unix 命令。其实详细比较下&#xff0c;两…...

OJ练习第153题——分发糖果

分发糖果 力扣链接&#xff1a;135. 分发糖果 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。…...

iOS 通知推送服务端部署测试过程详细版

文章目录 iOS 通知推送服务端部署测试过程详细版前言部署Serverless 版Bark-server1.注册Render 账号2.创建一个Web Service3.连接 repository4.Web Service 设置推送测试1.手机端安装 bark2.设定服务器3.发送测试推送请求参数列表:4.手机推送结果iOS 通知推送服务端部署测试过…...

【COMP282 LEC3 LEC4 LEC5】

LEC 3 Overloading 超载 1. Two functions can have the same name if they have different parameters 2. The compiler will use the one whose parameters match the ones you pass in Performing Addition “” 重载一个operator &#xff0c;这个operator函数被定义…...

panda3d加载模型复习和python面向对象编程属性学习

运行一个python示例&#xff1b;然后去除一些代码&#xff0c;只剩下加载模型相关&#xff0c;如下&#xff1b; from panda3d.core import loadPrcFileData # Configure the parallax mapping settings (these are just the defaults) loadPrcFileData("", "p…...

使用 Node.js 生成优化的图像格式

使用 Node.js 生成优化的图像格式 图像是任何 Web 应用程序的重要组成部分&#xff0c;但如果优化不当&#xff0c;它们也可能成为性能问题的主要根源。在本文中&#xff0c;我们将介绍如何使用 Node.js 自动生成优化的图像格式&#xff0c;并以最适合用户浏览器的格式显示它们…...

【WinAPI详解】<CreateWindowEx详解>

函数原型: HWND CreateWindowEx(DWORD dwExStyle, //窗口的扩展风格&#xff08;加强版专有&#xff09;LPCTSTR lpClassName, //已经注册的窗口类名称LPCTSTR lpWindowName,//窗口标题栏的名字DWORD dwStyle, //窗口的基本风格int x, //窗口左上角水平坐标位置int …...

【Git】分支管理

文章目录 一、理解分支二、创建、切换、合并分支三、删除分支四、合并冲突五、合并模式六、分支策略七、bug分支八、强制删除分支 努力经营当下 直至未来明朗&#xff01; 一、理解分支 HEAD指向的是master分支&#xff0c;master中指向的是最新一次的提交&#xff0c;也就是m…...

玩转单元测试之gtest

引言 程序开发的时候&#xff0c;往往需要编写一些测试样例来完成功能测试&#xff0c;以保证自己的代码在功能上符合预期&#xff0c;能考虑到一些异常边界问题等等。 gtest快速入门 1.引入gtest # 使用的是1.10版本&#xff0c;其他版本可根据需要选择 git clone -b v1.1…...

Tomcat 一次请求的生命周期

在使用 Tomcat 的时候&#xff0c;我们只需要在 Servlet 实现类中写我们的业务逻辑代码即可&#xff0c;不需要管 Socket 连接、协议处理要怎么实现&#xff0c;因为这部分作为不经常变动的部分&#xff0c;被封装到了 Tomcat 中&#xff0c;程序员只需要引入 Tomcat 中即可&am…...

spring cloud gateway中配置uri

gateway中配置uri配置有三种方式: websocket方式&#xff1a;uri: ws://localhost:9000http方式: uri: http://localhost:8130/lb注册中心配置方式&#xff08;注册的服务名称&#xff09;: uri: lb://monitor-ms gateway的lb方式识别的服务名称命名规则&#xff1a; "[…...

使用NAudio录制wav音频

NAudio NAudio官网 环境 Unity2019.4.34f1c1 Window10 NAudio 1.10 .Net 3.5 录制音频 WaveInEvent类可录制音频 StartRecording方法 启用录制StopRecording方法 停止录制DataAvailable 录制中回调RecordingStopped 录制结束回调 WaveFileWriter类可存储音频 Write方法…...

数据结构之动态内存管理机制

目录 数据结构之动态内存管理机制 占用块和空闲块 系统的内存管理 可利用空间表 分配存储空间的方式 空间分配与回收过程产生的问题 边界标识法管理动态内存 分配算法 回收算法 伙伴系统管理动态内存 可利用空间表中结点构成 分配算法 回收算法 总结 无用单元收…...

【汇编语言】栈及栈操作的实现

文章目录 栈结构栈操作栈的小结 栈结构 栈是一种只能在一端插入或删除的数据结构&#xff1b;栈有两个基本的操作&#xff1a;入栈和出栈&#xff1b; 入栈&#xff1a;将一个新的元素放到栈顶&#xff1b;出栈&#xff1a;从栈顶取出一个元素&#xff1b; 栈的操作规则&#…...

【JavaEE】面向切面编程AOP是什么-Spring AOP框架的基本使用

【JavaEE】Spring AOP&#xff08;1&#xff09; 文章目录 【JavaEE】Spring AOP&#xff08;1&#xff09;1. Spring AOP 是什么1.1 AOP 与 Spring AOP1.2 没有AOP的世界是怎样的1.3 AOP是什么 2. Spring AOP 框架的学习2.1 AOP的组成2.1.1 Aspect 切面2.1.2 Pointcut 切点2.1…...

SpringBoot+微信小程序奶茶在线点单小程序系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBoot微信小程序框架开发的奶茶在线点单小程序系统。首先&#xff0c;这是一个前后端分离的项目&#xff…...

【支付宝小程序】开发基础--文件结构教程

&#x1f996;我是Sam9029&#xff0c;一个前端 Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主 &#x1f431;‍&#x1f409;&#x1f431;‍&#x1f409;恭喜你&#xff0c;若此文你认为写的不错&#xff0c;不要吝啬你的赞扬&#xff0c;求收…...

LLM 生成式配置的推理参数温度 top k tokens等 Generative configuration inference parameters

在这个视频中&#xff0c;你将了解一些方法和相关的配置参数&#xff0c;这些参数可以用来影响模型在下一个词生成时的最终决策方式。如果你在Hugging Face网站或AWS的游乐场中使用过LLMs&#xff0c;你可能已经看到了这些控制选项&#xff0c;用来调整LLM的行为。每个模型都暴…...

npm的镜像源和代理的查看和修改

一、镜像源 查询当前镜像源 npm get registry 设置为淘宝镜像 npm config set registry http://registry.npm.taobao.org/ 设置回默认的官方镜像 npm config set registry https://registry.npmjs.org/ 设置electron为淘宝镜像 npm config set ELECTRON_MIRROR "h…...

IP库新增经过实践的Verilog 库

网上严重缺乏实用的 Verilog 设计。Project F 库是尝试让 FPGA 初学者变得更好部分。 设计包括 Clock- 时钟生成 (PLL) 和域交叉Display - 显示时序、帧缓冲区、DVI/HDMI 输出Essential- 适用于多种设计的便捷模块Graphics- 绘制线条和形状Maths- 除法、LFSR、平方根、正弦....…...

域名怎么做网站/优化教程

原文&#xff1a;http://davidhhs.iteye.com/blog/2268888 功能优化&#xff0c;增加级联查询功能&#xff08;注&#xff1a;依赖Jquery.js&#xff0c;附有源代码&#xff0c;可以当作插件直接使用&#xff09; 级联查询下拉框组调用代码&#xff1a; bindCascadeAutoSelec…...

html5 网站/大数据精准营销

以前一直有个很疑惑的问题没有搞清楚 关于ios中 viewcontroller的跳转问题&#xff0c;其中有一种方式是采用navigationController pushViewController 的方法&#xff0c;比如我从主页面跳转到了一级页面&#xff0c;又从一级页面跳转到了二级页面&#xff0c;然后从二级页面跳…...

网站如何调用手机淘宝做淘宝客/免费seo视频教学

大家好&#xff0c;我是多选参数的一员 —— 大炮。这里先剧透一下&#xff0c;在一段时间后&#xff0c;多选参数会搞一个抽奖福利&#xff0c;其中是有《可读代码编写的艺术》以及其他书籍(可能还有别的) 的福利。可以先关注「 多选参数 」&#xff0c;以方便第一时间参与抽奖…...

西安网站建设公司哪家好/查看别人网站的访问量

Android studio 版本及特性系列目录 Android studio 4.1新特性Android Studio 4.0新特性及升级异常Android Studio3.6. 插件搜索不到终极解决方案 插件无法搜索解决方案一.排查他因1. 网络检查2. 取消代理二、终极方案1.离线下载2. availables.xml替换方案三、无效方案1.取消 …...

网站 关键词 挖掘/推广引流软件

命令怎么用&#xff08;三种方式&#xff09;shutdown --help shutdown --? man shutdown &#xff08;man 就是manual 手册, 指南&#xff09; 服务 service怎么知道服务的名字呢&#xff1f;用这个命令chkconfig&#xff1a; chkconfig --list 会列出所有的服务项 启动服务…...

电子商城网站开发要多少钱/优化大师破解版app

...