Python教程:字符串中的第一个唯一字符
Python教程——字符串中的第一个唯一字符
题目:
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
案例:
s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.
注意事项:您可以假定该字符串只包含小写字母。
解题思路:
很简单的题,无非就是对字符串的字母进行频率统计,找到出现频率为1 的字母索引。
借助哈希映射两次遍历完成。第一次遍历进行字母频率统计,Hash Map 的Key 为字母,Value 为出现频率。第二次遍历找到频率为 1 的字母索引返回即可。
不同于单词频率统计,字母一共只有 26 个,所以可以直接利用 ASii 码表里小写字母数值从 97~122,直接用 int 型数组映射。建立映射:索引为 小写字母的 ASii 码值,存储值为出现频率。
哈希映射解题:
Java:
class Solution {
public int firstUniqChar(String s) {
char[] chars = s.toCharArray();//转成 Char 数组
Map map = new HashMap<>();
for (Character c: chars) map.put(c, map.getOrDefault(c, 0) + 1);//频率统计
for (int i = 0; i < chars.length; i++) {
if(map.get(chars[i])==1) return i;//找到词频为1的字母(只出现一次)返回其索引
}
return -1;
}
}
Python:
class Solution:
def firstUniqChar(self, s):
count = collections.Counter(s)# 该函数就是Python基础库里词频统计的集成函数
index = 0
for ch in s:
if count[ch] == 1:
return index
else:
index += 1
return -1
数组映射解题:
Java:
class Solution {
public int firstUniqChar(String s) {
char[] chars = s.toCharArray();
int base = 97;
int[] loc = new int[26];
for (char c:chars) loc[c - base] += 1;
for (int i = 0; i < chars.length; i++) {
if(loc[chars[i]-base]==1) return i;
}
return -1;
}
}
Python 基础数据结构里没有 char 型,强行使用chr(i)转换,只会导致效率更低
Python教程:字符串中的第一个唯一字符
字符串函数解题:
Java:
利用 Java 字符串集成操作函数解题,很巧妙,效率也很高。
其中:
indexOf(): 返回该元素第一次出现的索引,没有则返回 -1
lastIndex(): 返回该元素最后一次出现的索引,没有则返回 -1
class Solution {
public int firstUniqChar(String s) {
int res = s.length();
for (int i = 'a'; i <= 'z'; i++) {
int firstIndex = s.indexOf((char)i);
if (firstIndex == -1) continue;
int lastIndex = s.lastIndexOf((char)i);
if (firstIndex == lastIndex) {//两次索引值相同则证明该字母只出现一次
res = Math.min(firstIndex, res);//res 为只出现一次的字母中索引值最小的
}
}
return res == s.length() ? -1 : res;
}
}
大家有什么意见的或者建议欢迎留言指出!更多的Python教程也会继续为大家更新!大家有需要学习课程的也可以岫岩或者私信!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java 8:一文带你掌握 Lambda 表达式
本期教程将介绍 Java 8 新增的 Lambda 表达式,包括 Lambda 表达式的常见用法以及方法引用的用法,并对 Lambda 表达式的原理进行分析,最后对 Lambda 表达式的优缺点进行一个总结。 概述 Java 8 引入的 Lambda 表达式的主要作用就是简化部分匿名内部类的写法。 能够使用 Lambda 表达式的一个重要依据是必须有相应的函数接口。所谓函数接口,是指内部有且仅有一个抽象方法的接口。 Lambda 表达式的另一个依据是类型推断机制。在上下文信息足够的情况下,编译器可以推断出参数表的类型,而不需要显式指名。 常见用法 2.1 无参函数的简写 无参函数就是没有参数的函数,例如 Runnable 接口的 run() 方法,其定义如下: @FunctionalInterface public interface Runnable { public abstract void run(); }在 Java 7 及之前版本,我们一般可以这样使用: new Thread(new Runnable() { @Override public void run() { Sy...
- 下一篇
【Java核心技术卷】深入理解Java的内部类
通过图示进行分析:该图展示了Java内部类的编译解释过程. 你会看到整个过程很繁琐. 因为历史原因, Java语言规范 和字节码语言规范有不重叠的部分, 最初的时候,它们是重叠的. 但是后来随着Java的发展,有新的东西需要加入,比如说泛型,但是字节码语言规范不能够轻易变更,因为这个涉及到兼容问题. 能够动的只有编译器, 通过编译器把Java源程序编译成满足字节码语言规范的字节码文件进行执行.今天的内部类 和泛型一样,也是后来加入的. 关于内部类的实现,其实编译器在后面做了很多很多的东西, 虽然内部类有被Lambda表达式取代的趋势(Lambda表达式有自己的解释器),但是还是需要五深入理解的. 直接介绍凝练点:1.Java源程序要遵循Java语言规范,Java编译器按照Java语言规范来编译Java源程序。2.字节码程序要遵循字节码语言规范,JVM的Java解释器/JIT编译器按照字节码语言规范来解释/编译运行字节码程序。3.Java语言与字节码语言是两种不同的语言。它们的语言规范有相同处,也存在不同处例如: 相同处:均有访问控制符。一个类内部的私有成员只能被该类的其它成员所访问,其...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- 2048小游戏-低调大师作品
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker安装Oracle12C,快速搭建Oracle学习环境