LeetCode算法题-First Unique Character in a String(Java实现)
这是悦乐书的第213次更新,第226篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第81题(顺位题号是387)。给定一个字符串,找到它中的第一个非重复字符并返回它的索引。 如果它不存在,则返回-1。例如:
输入:“leetcode”
输出:0
输入:“loveleetcode”,
输出:2
注意:您可以假设该字符串仅包含小写字母。
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
直接使用字符串自带的方法indexOf和lastIndexOf,只要这两个方法找到当前字符所在的索引相等,即表示当前字符就是第一个非重复字符。
此解法的时间复杂度最好的情况是O(n),最坏的情况是O(n^2),空间复杂度是O(1)。
public int firstUniqChar(String s) {
for(int i=0; i<s.length(); i++){
if (s.indexOf(s.charAt(i)) == s.lastIndexOf(s.charAt(i))) {
return i;
}
}
return -1;
}
03 第二种解法
因为题目给定范围是局限于小写字母,可以使用一个长度为26的数组,存储每个字符出现的次数,然后再去数组中找到只出现一次的字符,返回索引即可。
此解法的时间复杂度是O(n),空间复杂度是O(1),因为数组长度是定长的。
public int firstUniqChar2(String s) {
int[] arr = new int[26];
for (int i=0; i<s.length(); i++) {
arr[s.charAt(i)-'a']++;
}
for (int j=0; j<s.length(); j++) {
if (arr[s.charAt(j)-'a'] == 1) {
return j;
}
}
return -1;
}
04 第三种解法
此解法和第二种解法思路一致,区别在于数组容量变成了256,可以直接使用当前字符所表示的整数,而不必像第一种解法那样要减去字符小写a的值。
此解法的时间复杂度是O(n),空间复杂度是O(1),因为数组长度是定长的。
public int firstUniqChar3(String s) {
int[] arr = new int[256];
for (int i=0; i<s.length(); i++) {
arr[s.charAt(i)]++;
}
for (int j=0; j<s.length(); j++) {
if (arr[s.charAt(j)] == 1) {
return j;
}
}
return -1;
}
05 第四种解法
使用HashMap,key为当前字符,value为其出现次数,先使用循环,将所有字符put进去。再利用循环,判断当前字符作为key在map中的value是否等于1,如果相等,返回当前索引。
此解法的时间复杂度是O(n),空间复杂度是O(1),因为map中至多会存储26个键值对。
public int firstUniqChar4(String s) {
Map<Character, Integer> map = new HashMap<Character, Integer>();
for(int j=0; j<s.length(); j++){
map.put(s.charAt(j), map.getOrDefault(s.charAt(j), 0)+1);
}
for (int i=0; i<s.length(); i++) {
if (map.get(s.charAt(i)) == 1) {
return i;
}
}
return -1;
}
06 小结
算法专题目前已连续日更超过两个月,算法题文章81+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-First Unique Character in a String(Java实现)的更多相关文章
- Leetcode算法比赛----First Unique Character in a String
问题描述 Given a string, find the first non-repeating character in it and return it's index. If it doesn ...
- LeetCode算法题-Number of Lines To Write String(Java实现)
这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...
- LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)
这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...
- LeetCode算法题-Binary Number with Alternating Bits(Java实现)
这是悦乐书的第292次更新,第310篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第160题(顺位题号是693).给定正整数,检查它是否具有交替位:即它的二进制数的任意两 ...
- LeetCode算法题-Trim a Binary Search Tree(Java实现)
这是悦乐书的第284次更新,第301篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第152题(顺位题号是669).给定二叉搜索树以及L和R的最低和最高边界,修剪树以使其所 ...
- LeetCode算法题-Maximum Product of Three Numbers(Java实现)
这是悦乐书的第275次更新,第291篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第143题(顺位题号是628).给定一个整数数组,从其中找出三个数,使得乘积最大.例如: ...
- LeetCode算法题-Maximum Depth of N-ary Tree(Java实现)
这是悦乐书的第261次更新,第274篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第128题(顺位题号是559).给定n-ary树,找到它的最大深度.最大深度是从根节点到 ...
- LeetCode算法题-Convert BST to Greater Tree(Java实现)
这是悦乐书的第255次更新,第268篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第122题(顺位题号是538).给定二进制搜索树(BST),将其转换为更大树,使原始BS ...
- LeetCode算法题-K-diff Pairs in an Array(Java实现)
这是悦乐书的第254次更新,第267篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第121题(顺位题号是532).给定一个整数数组和一个整数k,您需要找到数组中唯一的k- ...
随机推荐
- 翻译:用户变量(User-Defined Variable)(已提交到MariaDB官方手册)
本文为mariadb官方手册:User-Defined Variables的译文. 原文:https://mariadb.com/kb/en/user-defined-variables/我提交到Ma ...
- μC/OS-II 中的任务管理
1. 任务的状态及其转换 睡眠状态: 任务在没有被配备任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态. 等待状态: 正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会 ...
- keras入门(三)搭建CNN模型破解网站验证码
项目介绍 在文章CNN大战验证码中,我们利用TensorFlow搭建了简单的CNN模型来破解某个网站的验证码.验证码如下: 在本文中,我们将会用Keras来搭建一个稍微复杂的CNN模型来破解以上的 ...
- 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一)
转发时请注明原创作者及地址,否则追究责任. 原创:alunchen 当创建AspNetCore项目时 当我们创建一个AspNetCore项目时,需要我们手动添加Log: services.AddLog ...
- 【转载】Centos系统快速部署LNMP环境
PHP语言在Linux系统上运行的时候,需要在Linux系统上部署相应的Nginx.MySQL.PHP等环境,只有将这些环境参数都设置好,PHP相关应用程序才可正常运行,部署环境的方法有很多种,可手动 ...
- mongodb遇到的问题
安装好mongodb之后,服务里默认增加了一个mongodb service的服务,但是服务打不开,右键选择其属性,看他的执行路径执行的是cfg配置文件,看了配置文件里的东西,发现和自己想要的差不多, ...
- Tomcat服务器为java项目配置顶级域名
修改端口, Tomcat服务器下conf/server.xml文件 把端口号更改为80 解释:输入域名时默认进入80端口,如果没修改则需要输入端口号才能进入. Eg:www.xxx.com: ...
- nginx 日子配置
nginx access_log nginx 日志说明 不同用户防卫Nginx会把每个用户访问往咱的日志信息记录到指定的日志文件里,供网站管理员分析用户浏览行为等,此功能又ngx_http_log_m ...
- Ubuntu创建新用户的正确姿势
作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<Ubuntu 创建新用户的正确姿势>原文地址.更欢迎来我的小站看更多原创内容:godbmw.com,进行&q ...
- 设计模式—模板方法的C++实现
这是Bwar在2009年写的设计模式C++实现,代码均可编译可运行,一直存在自己的电脑里,曾经在团队技术分享中分享过,现搬到线上来. 1. 模板方法简述 1.1 目的 定义一个操作中的算法骨架,而将一 ...