【剑指offer】054-字符流中第一个不重复的字符

题目

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

方法

网上的方法基本都是使用map或者ArrayList存储字符流,不知道是不是我理解错了题意,这里我阐述另一个方法

思路

字符流是一个个读取的,我们初始化一个数组或者一个空字符串用来存储一个个字符,这里我使用空字符串。

题目要求找到当前状态下,第一个出现一次的字符。那么可以利用一个个字符的特性,当读取一个字符的时候,就将这个字符接到字符串到尾部

但接入到尾部有条件限制,必须是前面没有出现过这个字符才加入,如果前面已经存在这个字符,不仅不加入,还要把前面出现的字符删除。目的就是,这个字符串中只包含当前状态下,只出现过一次的字符。那么字符串的首位就是题目要求的了——当前第一个不重复的字符

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Init module if you need
function Init ({
  // write code here
  this.str = ''
}
// Insert one char from stringstream
function Insert (ch{
  // write code here
  for (let i = 0; i < this.str.length; i++) {
    if (this.str[i] === ch) {
      this.str = this.str.replace(ch, '')
      return
    }
  }
  this.str += ch
}
// return the first appearence once char in current stringstream
function FirstAppearingOnce ({
  // write code here
  return this.str.length > 0 ? this.str[0] : '#'
}
文章作者: ptp
文章链接: https://youyingjie114.github.io/2019/11/07/jz-offer/jz-offer-054/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PTP'S BLOG