String类相关oj练习
前言:
此处练习对应博客文章:公主,王子,请点击
1.第一次只出现一次的字符
做题首先看清要求和提示:
给定一个字符串
s
,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回-1
。
提示:
1 <= s.length <= 105
s
只包含小写字母
这就要用到我们所学的字符串的知识了,我们可以通过String的常用方法chatAt,直接查找当前位置的字符。
接下来有两种思路,一种就是暴力求解,另外一种就是运用哈希的思想
暴力求解:
定义两个变量,i和j,i从0下标开始遍历,j从1下标开始遍历,当j遍历完之后,没有找到相同的,直接退出循环。如果找到相同的,则i++。如下图(这种方式极力不推荐,因为时间复杂度较大,我们说另一种方式)
哈希思想
可以先,定义一个0到122的count数组。
由题目可知,s只包含小写字母,a的Ascii码值为97,可以将字符存在对应下标下面。
通过字符对应的数组下标自增加1,做好标记。
然后找到数组中为1,且第一次出现的字符。
1.1定义一个计数数组
下标0~96的空间无法利用,可以对他进行优化
通过当前字符与‘a’相减,从而缩小数组范围
代码如下:
int[] count = new int [26];
1.2.遍历字符串 记录次数
//遍历字符串,记录次数for(int i = 0;i < n;i++){count[s.charAt(i) - 'a']++;}
1.3.再次遍历字符串
这时不要遍历count数组,这个做法是错误的。
//再次遍历for(int i = 0;i < n;i++){if(count[s.charAt(i)-'a']==1)return i;}return -1;
跳出循环,没有只出现一次的字符,返回-1.
1.4 代码实例
public static int firstUniqChar(String s) {//定义一个计数数组int[] chars = new int[26];//遍历字符串,记录次数for(int i = 0; i < s.length(); i++){chars[s.charAt(i) - 'a']++;}//再次遍历for (int i = 0; i < s.length(); i++) {if(chars[s.charAt(i) - 'a'] == 1)return i;}return -1;}
我们可以看到通过时间是6ms,但我觉得还有改进的空间。
于是进行了下列的改进:
1. 我直接求出字符串的长度,并通过ch接收,减少循环条件求字符串长度的时间
2.将定义数组放在后面,可以减少一毫秒的运算速度,这个原因,现在还不知道。zu
改进的代码如下:
int ch = s.length();int[] count = new int [26];//遍历字符串,记录次数for(int i = 0;i < ch;i++){count[s.charAt(i) - 'a']++;}//再次遍历for(int i = 0;i < ch;i++){if(count[s.charAt(i)-'a']==1)return i;}return -1; }
2.最后一个单词的长度
题目:
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
本题我采用三种方式来做,当然还有更多的方式可供大家探索。
2.1.第一种方式运用String常用方法split进行分割
通过split函数将原字符串分割为字符串数组。如下图示例:
字符串数组最后一个元素即是原字符串的最后一个单词,直接输出其长度。
代码如下:
import java.util.Scanner;public class Main{public static void main(String[] args){//标准输入Scanner sc=new Scanner(System.in);//键盘输入字符串String str=sc.nextLine();//以空格分割为字符串数组String[] arr=str.split(" ");//字符串数组最后一个元素即是原字符串的最后一个单词,直接输出其长度System.out.println(arr[arr.length-1].length());}
}
- 时间复杂度:字符串分割需要遍历整个字符串,所以时间复杂度为O(n)。
- 空间复杂度:最坏情况下需要大小为n-1的字符串数组存储所有的单词,所以空间复杂度为O(n)。
2.2.第二种方法指针
解题思路
- 定义一个指针变量。
- 从后往前遍历字符串,当遇到空格时,用指针记录位置信息,并终止循环。
- 总长度减去指针到开头一段的长度,即得到最后一个单词的长度。
代码实例:
import java.util.Scanner;public class Main{public static void main(String[] args){//标准输入Scanner sc=new Scanner(System.in);//键盘输入字符串String str=sc.nextLine();//定义指针变量int index=-1;for(int i=s.length()-1;i>=0;i--){//从后往前第一个空格的位置if(s.charAt(i)==' '){index=i;break;}}//总长度减去指针到开头一段的长度,即得到最后一个单词的长度System.out.println(s.length()-index-1);}
}
- 时间复杂度:最坏情况下遍历整个字符串,所以时间复杂度为O(n)。
- 空间复杂度:需要额外常数级别的空间,所以空间复杂度为O(1)。
2.3 第三种方式,用lastlndexOf和substring方法
解题思路
- 用lastlndexOf找最后一个空格出现的位置,将位置传给index
- 然后用substring方法,从index+1,截取到str字符串末尾
- 最后一个单词长度就为,截取的字符串ret的长度
代码实例:
public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt());// 注意 while 处理多个 caseString str = in.nextLine();int index = str.lastIndexOf(" ");String ret = str.substring(index+1);System.out.println(ret.length());}
3.检查字符串是否为回文
3.1题目:
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
这题采用双指针的做法来做
3.2解题思路:
初始时,左右指针分别指向 字符串 的两侧,随后我们不断地将这两个指针相向移动,每次移动一步,并判断这两个指针指向的字符是否相同。当这两个指针相遇时,就说明 字符串 是回文串。
先判断条件,由题目可知。移除所有非字母数字字符,字母数字都属于字母数字字符
if((ch >= 'a' && ch <= 'z')||(ch >= '0' && ch <= '9')){return false;}
运用toLowerCase:方法将字符串转换为小写字母,以便在判断回文时不区分大小写。
3.3代码示例
public boolean isPalindrome(String s) {s = s.toLowerCase();int left = 0;int right = s.length()-1;while(left < right){while(left < right && isCharacterNum(s.charAt(left))){left ++;}while(left < right && isCharacterNum(s.charAt(right))){right --;}if(s.charAt(left)!= s.charAt(right)){return false;}else{left++;right--;}}return true; }private boolean isCharacterNum(char ch){if((ch >= 'a' && ch <= 'z') ||(ch >= '0' && ch <= '9')){return false;}return true;}
通过以下两种方法,可以直接获取字母和数字
优化代码如下:
public boolean isPalindrome(String s) {s = s.toLowerCase();int left = 0;int right = s.length()-1;while(left < right){while(left < right && isCharacterNum(s.charAt(left))){left ++;}while(left < right && isCharacterNum(s.charAt(right))){right --;}if(s.charAt(left)!= s.charAt(right)){return false;}else{left++;right--;}}return true; }private boolean isCharacterNum(char ch){if(Character.isDigit(ch) || Character.isLetter(ch)){return false;}return true;}
相关文章:

String类相关oj练习
前言: 此处练习对应博客文章:公主,王子,请点击 1.第一次只出现一次的字符 做题首先看清要求和提示: 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不…...

【Linux】进程实践项目 —— 自主shell编写
送给大家一句话: 不管前方的路有多苦,只要走的方向正确,不管多么崎岖不平,都比站在原地更接近幸福。 —— 宫崎骏《千与千寻》 自主shell命令编写 1 前言2 项目实现2.1 创建命令行2.2 获取命令2.3 分割命令2.4 运行命令 3 源代码…...

基于SpringBoot和Vue的学生笔记共享平台的设计与实现
今天要和大家聊的是一款基于SpringBoot和Vue的学生笔记共享平台的设计与实现 !!! 有需要的小伙伴可以通过文章末尾名片咨询我哦!!! 💕💕作者:李同学 💕&…...

C++心决之命名空间、重载函数和引用
目录 1. C关键字(C98) 2. 命名空间 2.1 命名空间定义 2.2 命名空间使用 3. C输入&输出 4. 缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 5. 函数重载 5.1 函数重载概念 5.2 C支持函数重载的原理--名字修饰(name Mangling) 6. 引用 6.1 引用概念 6.2 引用特性…...
higress使用了解
higress使用了解 了解下 http-echo、httpbin 镜像使用 未按文档实际搭建,但大致是这样 官方文档:https://higress.io/zh-cn/docs/overview/what-is-higress 了解:利用sealos快速安装kubernetes集群:https://note.youdao.com/s…...

Swagger3探索之游龙入海
引言 后端开发中常用的接口调用工具一般使用Postman、ApiPost工具,但后期需要与前端联调,要补充接口文档花费大量时间,此时Swagger3应运而生,大大提高沟通交流的效率。 引用依赖 <!-- Swagger3 调用方式 http://ip:port/swa…...

javaWeb项目-学生考勤管理系统功能介绍
项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog 1、JAVA技术 JavaSc…...

云备份项目认识、环境搭建以及所使用的库的介绍
一、云备份认识 将本地计算机一个受监管的文件夹的文件上传到服务器中,有服务器组织,客户端可以通过网页将文件查看并且下载下来,下载过程支持断点续传功能,并且服务器会对上传的文件进行热点管理,长时间没人访问的文…...

汇编语言第四版-王爽第2章 寄存器
二进制左移四位,相当于四进制左移一位。 debug命令实操,win11不能启动,需要配置文件 Windows64位系统进入debug模式_window10系统64位怎么使用debugger-CSDN博客...

MoonBit MeetUp回顾——张正、宗喆:编程语言在云原生与区块链领域的技术探索
宗喆和张正分别给我们带了 KCL 相关的最新进展,由蚂蚁集团开发的 Rust 编写的开源 DSL,目标是优化云原生策略配置和用户体验。它通过引入动态配置管理、配置校验和基础设施抽象等核心概念,解决开发者认知负担、配置膨胀和标准化工具缺乏的问题…...

云原生靶场kebernetesGoat、Metarget
靶场 文章目录 靶场kebernetesGoat靶场安装Docker in DockerSSRF漏洞容器逃逸到主系统Docker CIS 基线分析Kubernetes CIS 安全基线分析分析被部署挖矿软件的容器镜像获取环境信息Hidden in layersRBAC最低权限配置错误使用 Sysdig Falco 进行运行时安全监控和检测 Metarget ke…...

【3D目标检测】Det3d—SE-SSD模型训练(前篇):KITTI数据集训练
SE-SSD模型训练 1 基于Det3d搭建SE-SSD环境2 自定义数据准备2.1 自定义数据集标注2.2 训练数据生成2.3 数据集分割 3 训练KITTI数据集3.1 数据准备3.2 配置修改3.3 模型训练 1 基于Det3d搭建SE-SSD环境 Det3D环境搭建参考:【3D目标检测】环境搭建(OpenP…...

k8s1.28.8版本安装prometheus并持久化数据
本文参考 [k8s安装prometheus并持久化数据_/prometheus-config-reloader:-CSDN博客](https://blog.csdn.net/vic_qxz/article/details/119598466)前置要求: 已经部署了NFS或者其他存储的K8s集群. 这里注意networkpolicies网络策略问题,可以后面删除这个策略&#x…...

Mybatis-特殊SQL的执行
1. 模糊查询 在MyBatis中进行模糊查询时,有以下三种常见的实现方式: 1.1. 错误示范 先来个准备操作,并做一个错误示例 根据姓名,模糊查询用户,(x小x) 更新数据表 SQLMapper.java package com.sakurapaid.mybatis3…...

金融衍生品市场
金融衍生品市场 衍生金融品的作用衍生金融工具远期合约期货合约期权 衍生金融品的作用 套期保值(Hedging) 组合多头头寸(long position)与空头头寸(short position)例:股票与股指期货 投机 衍生金融工具 远期合约 定义:在将来…...

2、Cocos Creator 下载安装
Cocos Creator 从 v2.3.2 开始接入了全新的 Dashboard 系统,能够同时对多版本引擎和项目进行统一升级和管理!Cocos Dashboard 将做为 Creator 各引擎统一的下载器和启动入口,方便升级和管理多个版本的 Creator。还集成了统一的项目管理及创建…...
Docker版本:18.06.1安装
1、操作系统:CentOS 7.5以上 2、Docker版本:18.06.1 1、解压 tar -xvf docker-18.06.1-ce.tgz2、将解压出来的docker文件内容移动到 /usr/bin/ 目录下 cp docker/* /usr/bin/3、将docker注册为service vim /etc/systemd/system/docker.service将下列…...
记 SpringBoot 使用@RequestBody 接收不到参数
POST请求,前端传的参数名字跟后端规定的参数一样。但是通过RequestBody注解接收的参数始终为NULL! //实体类中属性没有用驼峰命名 private String SubscribeID; /*** 标题*/ private String Title;解决方案: 1、字段上使用JsonProperty(valu…...

unity 打包安卓错误汇集
Failed to find target with hash string "android-34’ in: D:Pr 他说找不到sdk34level的我用as打开后卸载又重装,最后解决了 我放到Plugins/Android/下面的Java代码没有被编译 这个不知道为什么。我故意把代码写的有问题,会报错那种ÿ…...

C语言-文件操作
🌈很高兴可以来阅读我的博客!🌟我热衷于分享🖊学习经验,🏫多彩生活,精彩足球赛事⚽🔗我的CSDN: Kevin ’ s blog📂专栏收录:C预言 1. 文件的作用 …...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...