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

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.第二种方法指针

 解题思路

  1. 定义一个指针变量。
  2. 从后往前遍历字符串,当遇到空格时,用指针记录位置信息,并终止循环。
  3. 总长度减去指针到开头一段的长度,即得到最后一个单词的长度。

代码实例:  

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方法

  解题思路

  1. 用lastlndexOf找最后一个空格出现的位置,将位置传给index
  2. 然后用substring方法,从index+1,截取到str字符串末尾
  3. 最后一个单词长度就为,截取的字符串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练习

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

【Linux】进程实践项目 —— 自主shell编写

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

基于SpringBoot和Vue的学生笔记共享平台的设计与实现

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

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 镜像使用 未按文档实际搭建&#xff0c;但大致是这样 官方文档&#xff1a;https://higress.io/zh-cn/docs/overview/what-is-higress 了解&#xff1a;利用sealos快速安装kubernetes集群&#xff1a;https://note.youdao.com/s…...

Swagger3探索之游龙入海

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

javaWeb项目-学生考勤管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、JAVA技术 JavaSc…...

云备份项目认识、环境搭建以及所使用的库的介绍

一、云备份认识 将本地计算机一个受监管的文件夹的文件上传到服务器中&#xff0c;有服务器组织&#xff0c;客户端可以通过网页将文件查看并且下载下来&#xff0c;下载过程支持断点续传功能&#xff0c;并且服务器会对上传的文件进行热点管理&#xff0c;长时间没人访问的文…...

汇编语言第四版-王爽第2章 寄存器

二进制左移四位&#xff0c;相当于四进制左移一位。 debug命令实操&#xff0c;win11不能启动&#xff0c;需要配置文件 Windows64位系统进入debug模式_window10系统64位怎么使用debugger-CSDN博客...

MoonBit MeetUp回顾——张正、宗喆:编程语言在云原生与区块链领域的技术探索

宗喆和张正分别给我们带了 KCL 相关的最新进展&#xff0c;由蚂蚁集团开发的 Rust 编写的开源 DSL&#xff0c;目标是优化云原生策略配置和用户体验。它通过引入动态配置管理、配置校验和基础设施抽象等核心概念&#xff0c;解决开发者认知负担、配置膨胀和标准化工具缺乏的问题…...

云原生靶场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环境搭建参考&#xff1a;【3D目标检测】环境搭建&#xff08;OpenP…...

k8s1.28.8版本安装prometheus并持久化数据

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

Mybatis-特殊SQL的执行

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

金融衍生品市场

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

2、Cocos Creator 下载安装

Cocos Creator 从 v2.3.2 开始接入了全新的 Dashboard 系统&#xff0c;能够同时对多版本引擎和项目进行统一升级和管理&#xff01;Cocos Dashboard 将做为 Creator 各引擎统一的下载器和启动入口&#xff0c;方便升级和管理多个版本的 Creator。还集成了统一的项目管理及创建…...

Docker版本:18.06.1安装

1、操作系统&#xff1a;CentOS 7.5以上 2、Docker版本&#xff1a;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请求&#xff0c;前端传的参数名字跟后端规定的参数一样。但是通过RequestBody注解接收的参数始终为NULL&#xff01; //实体类中属性没有用驼峰命名 private String SubscribeID; /*** 标题*/ private String Title;解决方案&#xff1a; 1、字段上使用JsonProperty(valu…...

unity 打包安卓错误汇集

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

C语言-文件操作

&#x1f308;很高兴可以来阅读我的博客&#xff01;&#x1f31f;我热衷于分享&#x1f58a;学习经验&#xff0c;&#x1f3eb;多彩生活&#xff0c;精彩足球赛事⚽&#x1f517;我的CSDN&#xff1a; Kevin ’ s blog&#x1f4c2;专栏收录&#xff1a;C预言 1. 文件的作用 …...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...