首页IT科技字符串中第一次只出现一次的字符(每日算法之字符流中第一个不重复的字符)

字符串中第一次只出现一次的字符(每日算法之字符流中第一个不重复的字符)

时间2025-08-03 05:28:03分类IT科技浏览6011
导读:JZ75 字符流中第一个不重复的字符 题目 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符...

JZ75 字符流中第一个不重复的字符

题目

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

方法1 使用LinkedHashMap

思路

算法实现

LinkedHashMap实现顺序插入        ,不过查询速度会比较慢 具体做法: step 1:用哈希表统计每个字符的次数                         ,是全局变量                 。 step 2:在Insert函数中对输入的字符                 ,然后统计出现次数                         。 step 3:在FirstAppearingOnce函数遍历该字符串        ,对于每个字符查找哈希表                        ,返回第一个计数为1的字符                 ,则返回#        。

代码

package mid.JZ75字符流中第一个不重复的字符; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; public class Solution { Map<Character,Integer> map = new LinkedHashMap<>(); //Insert one char from stringstream public void Insert(char ch) { map.put(ch, map.getOrDefault(ch, 0) + 1); } //return the first appearence once char in current stringstream /** * LinkedHashMap实现顺序插入,不过查询速度会比较慢 * 运行时间 165ms * 占用内存 15860KB * @return */ public char FirstAppearingOnce() { for (Character character : map.keySet()) { if (map.get(character) == 1) { return character; } } return #; } }

方法2 哈希表+字符串(推荐使用)

思路

算法实现

又是一个找到是否重复的问题        。我们还是可以用哈希表来记录各个字符出现的次数                        , 根据这样只要是字符串最前面且哈希表中次数为1的字符就是我们要找的                         。 具体做法: step 1:准备一个字符串来记录输入的字符流                         ,用哈希表统计每个字符的次数,二者都是全局变量                。 step 2:在Insert函数中对输入的字符                ,加到字符串最后                         ,然后统计出现次数        。 step 3:在FirstAppearingOnce函数遍历该字符串        ,对于每个字符查找哈希表                ,返回第一个计数为1的字符                         , 如果遍历完字符串以后都没        ,则返回#                         。

代码

package mid.JZ75字符流中第一个不重复的字符; import java.util.HashMap; import java.util.Map; public class Solution2 { StringBuilder sb = new StringBuilder(); Map<Character,Integer> map = new HashMap<>(); //Insert one char from stringstream public void Insert(char ch) { sb.append(ch); map.put(ch, map.getOrDefault(ch, 0) + 1); } //return the first appearence once char in current stringstream /** * 运行时间 13ms * 占用内存 9952KB * @return */ public char FirstAppearingOnce() { for (int i = 0; i < sb.length(); i++) { if (map.get(sb.charAt(i)) == 1) { return sb.charAt(i); } } return #; } }

方法3 哈希表+字符串(推荐使用)

思路

算法实现

除了使用字符串记录字符流        ,还可以用队列记录字符流                         ,每次插入的时候                 ,只需要将第一次出现的字符加入到队列中        ,然后正常计数                。 查找第一个不重复出现的字符的时候                        ,从队首开始查询哈希表                 , 如果出现次数为1,则返回该字符                        ,如果不为1                         ,则从队首将其弹出。 具体做法: step 1:准备一个队列来记录输入的字符流,用哈希表统计每个字符的次数                ,二者都是全局变量                         。 step 2:在Insert函数中对输入的字符                         ,加到队列最后        ,然后统计出现次数                        。 step 3:在FirstAppearingOnce函数中                ,不断检查队首元素直到队列为空                         ,队首出现次数为1次        ,就返回        , 队首出现次数不为1就弹出。                         ,则返回#                 。

代码

package mid.JZ75字符流中第一个不重复的字符; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue; public class Solution3 { Queue<Character> queue = new LinkedList<>(); Map<Character,Integer> map = new HashMap<>(); //Insert one char from stringstream public void Insert(char ch) { if (!map.containsKey(ch)) { queue.offer(ch); } map.put(ch, map.getOrDefault(ch, 0) + 1); } //return the first appearence once char in current stringstream /** * 运行时间 15ms * 占用内存 9972KB * @return */ public char FirstAppearingOnce() { while(!queue.isEmpty()) { if (map.get(queue.peek()) == 1) { return queue.peek(); } else { queue.poll(); } } return #; } }

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
联想电脑bios安全启动模式在哪里(如何在BIOS中进行安全设置?联想笔记本电脑BIOS基本设置图文教程) c++中long怎么用(C++11:longlong超长整型和nullptr初始化空指针)