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

  本篇文章为你整理了每日算法之字符流中第一个不重复的字符(字符串中第一次只出现一次的字符)的详细内容,包含有字符串出现的不重复最长长度 字符串中第一次只出现一次的字符 字符串查找第一个不重复的字母 给定一个字符串,找出第一个不重复的字符 每日算法之字符流中第一个不重复的字符,希望能帮助你了解 每日算法之字符流中第一个不重复的字符。

  

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符 "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 #;

  

 

  以上就是每日算法之字符流中第一个不重复的字符(字符串中第一次只出现一次的字符)的详细内容,想要了解更多 每日算法之字符流中第一个不重复的字符的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: