找第一个只出现一次的字符_剑指offer 字符流中第一个只出现一次的字符

题目描述:

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是'g'。当从该字符流中读出前六个字"google"时,第一个只出现一次的字符是'l'。

分析:

字符只能一个一个从字符流中读出来,因此要定义一个容器来保存字符以及其在字符流中的位置。

  为尽可能搞笑解决问题,要在O(1)时间内往数据容器中插入字符,及其对应的位置,因此这个数据容器可以用哈希表来实现,以字符的ASCII码作为哈希表的键值key,字符对应的位置作为哈希表的值value。

  开始时,哈希表的值都初始化为-1,当读取到某个字符时,将位置存入value中,如果之前读取过该字符(即value>=0),将value赋值为-2,代表重复出现过。最后对哈希表遍历,在value>=0的键值对中找到最小的value,该value即为第一个只出现一次的字符,ASCII码为key的字符即为所求字符。

示例代码:

public class zifuliu_first_once {private static int[] occurence;private static int index = 0;private static void init_flag_arr() {occurence = new int[256];for (int i = 0; i < 256; i++) {occurence[i] = -1;}}private static void insert(char ch) {if (occurence[(int)ch] == -1) {occurence[(int)ch] = index;} else if (occurence[(int)ch] >= 0) {occurence[(int)ch] = -2;}index++;}private static char get_first_appear_once_char() {int min_index = Integer.MAX_VALUE;char ret = '*';for (int i = 0; i < 256; i++) {if (occurence[i] >= 0 && occurence[i] < min_index) {min_index = occurence[i];ret = (char) i;}}return ret;}public static void main(String[] args) {init_flag_arr();insert('g');insert('o');System.out.println(get_first_appear_once_char());insert('o');insert('g');insert('l');insert('e');System.out.println(get_first_appear_once_char());}
}

b60a5c6131a619ad877091f78af0b253.png
欢迎关注,一起学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python list是数组还是链表实现的_python 数据结构 list和链表实现栈的三种方法

MAX_SIZE 100classMyStack1(object):"""模拟栈"""def __init__(self):self.items[]self.size0defis_empty(self):"""判断是否为空"""return self.size 0defsize(self):"""返回栈的大小"&quo…

python去掉人像白边_python 使用plt画图,去除图片四周的白边方法

用matplotlib.pyplot画的图&#xff0c;显示和保存的图片周围都会有白边&#xff0c;可以去掉。为了显示的更清楚&#xff0c;给图片加了红色的框代码“import matplotlib.pyplot as pltfig, ax plt.subplots()im im[:, :, (2, 1, 0)]ax.imshow(im, aspectequal)plt.axis(‘o…

python重复输出五句话_如何用python3输出重复的数据?

面对很多重复的数据&#xff0c;如果人工一个个处理起来会很麻烦&#xff0c;而且要浪费大量的时间和精力。之前就python处理数据是简单便捷的&#xff0c;有没有一种方法能把重复的数据输出出来&#xff0c;这样就一目了然了。相信有一些小伙伴也跟小编有同样的困扰&#xff0…

php mysql倒计时_php 倒计时程序

测试页面//获取系统时间&#xff0c;将时间以指定格式显示到页面。function systemTime(){//获取系统时间。var dateTimenew Date();var YYdateTime.getFullYear();var MMdateTime.getMonth();var DDdateTime.getDate();var hhdateTime.getHours();var mmdateTime.getMinutes()…

win10无法装载重装系统iso文件_win10镜像不能安装系统如何解决_win10镜像无法安装处理方法...

如今&#xff0c;大部分用户下载到的win10系统都是属于镜像文件&#xff0c;能够最大便利的让用户安装步骤简单化&#xff0c;可是最近有用户下载的win10系统中出现了镜像不能安装的问题&#xff0c;那么win10镜像不能安装系统如何解决呢&#xff1f;下面就来告诉大家win10镜像…

在python中使用什么工具管理模块_怎么使用Python pip(管理模块工具)

怎么使用Python pip(管理模块工具)发布时间&#xff1a;2020-08-26 16:04:26来源&#xff1a;亿速云阅读&#xff1a;71作者&#xff1a;Leah本篇文章给大家分享的是有关怎么使用Python pip(管理模块工具)&#xff0c;小编觉得挺实用的&#xff0c;因此分享给大家学习&#xff…

anaconda下载jupyter写python_如何安装Anaconda3和使用Jupyter

如何安装Anaconda3和使用Jupyter发布时间&#xff1a;2020-10-28 14:41:26来源&#xff1a;亿速云阅读&#xff1a;64作者&#xff1a;Leah这期内容当中小编将会给大家带来有关如何安装Anaconda3和使用Jupyter&#xff0c;文章内容丰富且以专业的角度为大家分析和叙述&#xff…

mysql用户添加_MySQL用户添加

我的是Ubuntu-12.04。发现在MySQL中经常出现添加用户之后&#xff0c;要么只能本地登陆&#xff0c;要么只能远程登陆的蛋疼的情况。这里记录一下是如何操作的。 创建用户 CREATE USER username% IDENTIFIED BY password; 如果想要让这个用户即可以本地登陆&#xff0c;也可以远…

mysql 42642 安装报错_1/5 MySQL入门总结:下载安装

MySQL.msi版本下载&#xff1a;www.mysql.com >DOWNLOADS >Windows >MySQL Installer >mysql-installer-community-8.0.13.0.msi(不建议下载解压缩版&#xff0c;因为它还要配置my.ini文件&#xff0c;亲身实践&#xff0c;麻烦)安装&#xff1a;o. 缺失“Microsof…

stm32滴答计时器_stm32笔记:Systick系统滴答定时器

Systick :系统心跳定时器,提供系统节拍裸机程序中可作为独立的延时定时器用途:1.产生操作系统的时钟节拍2.便于不同处理器之间程序移植SysTick定时器被捆绑在NVIC中&#xff0c;异常号153.作为一个闹铃测量时间用于测量时间,但当处理器在调试期间被喊停(halt)时&#xff0c;则S…

java href_jnlp href属性中的url参数

我已经有一段时间寻找这个答案&#xff0c;从来没有得到具体的解决方案 . 所以在这里我最终解决了它 . 我将在下面提出解决方案 .当前情况&#xff1a;有一个简单的java应用程序从带有参数的浏览器启动 . 现有的路由是browser - > index.html - >调用我的jnlp文件 - >…

java 3位小数_数字有效小数第三位四舍五入

[java]代码库import javax.swing.JOptionPane;public class Test{public static void main(String[] args){String sJOptionPane.showInputDialog("请输入数字&#xff1a;");double aDouble.parseDouble(s);//转换成数字double ba;//临时存储int p0;//用于计算小数从…

java实现文件合并_Java实现文件分割和文件合并实例

文件切割和文件合并这个问题困扰了我有一段时间了(超过一天没做粗来)。找了好多博客&#xff0c;本来想转载一个来的 结果找不到了。很无奈。只好自己贴代码上了。当然我会尽力好好写注释的。文件切割器:import java.io.File;import java.io.FileNotFoundException;import java…

java 线程池 资源回收_JAVA线程池资源回收的问题

最近项目中为了提高用户体验度&#xff0c;前台创建任务后台任务&#xff0c;用多线程来跑。现在的场景&#xff1a;后台定时任务管理这两个线程池&#xff0c;一个最大线程数10个&#xff0c;一个最大线程数15。应用部署之后&#xff0c;不超过5个小时&#xff0c;服务器负载高…

java 常量表达式_JavaSwitch语句:常量表达式是必需的,但它是常量

万千封印我知道编译器需要在编译时知道表达式才能编译一个开关&#xff0c;但是为什么foo.ba_常数不是呢&#xff1f;虽然从字段初始化后执行的任何代码的角度来看&#xff0c;它们都是常量&#xff0c;但它们不是编译时间常数在JLS所要求的意义上&#xff1b;见15.28常量表达式…

java post请求返回500错误信息_Retrofit API Post call 返回错误 500,适用于 Postman

我正在尝试使用改进 2 使用其他 API&#xff0c;我已经能够使用一些端点&#xff0c;但注册端点不断返回 http 500 错误代码&#xff0c;但在使用邮递员测试时工作正常。 POST("auth/signup/") Call addUser(Body SignUpCreds signUpCreds);这是注册凭据public class…

java 抽样_beta分布的采样或抽样(java程序)

beta分布的采样或抽样(java程序)标签&#xff1a;#beta分布采样#时间&#xff1a;2017/05/12 15:47:04作者&#xff1a;十七岁的雨季关于beta分布的介绍&#xff0c;请看我的另外一篇博客:http://blog.csdn.net/qy20115549/article/details/53307535本篇文章的另外地址为&#…

DP读书:《openEuler操作系统》(六)文件系统

10min速通文件系统 文件系统概述硬件基础磁盘和磁盘驱动器磁盘读写操作数据传输控制 文件系统中的基本概念文件目录文件系统 尽管内存的访问速度很快&#xff0c;但因其容量十分的有限&#xff0c;而且一旦断电&#xff0c;保存其中的数据就会丢失。用户希望数据保存的更大并且…

java web 开发技术大全 代码_Java Web开发技术大全

资深程序员全力打造&#xff0c;深入剖析SSH框架整合开发的精髓 全方位解读Java Web开发的基础知识、高级技术及应用案例 内容全面&#xff0c;讲解详细&#xff0c;全面覆盖JSP、Se rvlet、AJAX及SSH框架整合开发 避免冗长的理论讲解&#xff0c;而是直击主题&#xff0c;通过…

java nio doug_深入的聊聊 Java NIO

趁着三天假期&#xff0c;把Java NIO和Reactor模式整理总结了下&#xff0c;文章特别细节的知识点没有写&#xff0c;如一些API的具体实现。类似数据读到Buffer后再写出时&#xff0c;为什么需要复位操作&#xff0c;这些都属于NIO基础知识&#xff0c;是学习Reactor模式的前置…