54 剑指offer--字符串--字符流中第一个不重复的字符(第一次只出现一次的字符)
字符流中第一个不重复的字符(第一次只出现一次的字符)
牛客网上的
题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
public class Solution {
//Insert one char from stringstream
int[] arr = new int[128]; //记录次数
StringBuilder sb = new StringBuilder();//记录位置
public void Insert(char ch)
{
sb.append(ch);
arr[ch]++;
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
for(int i=0; i<sb.length(); i++){
if(arr[sb.charAt(i)]==1)
return sb.charAt(i);
}
return '#';
}
}
题目
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
思路
这道题还是很简单的。将字节流保存起来,通过哈希表统计字符流中每个字符出现的次数,顺便将字符流保存在string中,然后再遍历string,从哈希表中找到第一个出现一次的字符。
代码
public class firstUniqChar {
public static void main(String[] args) {
System.out.println(firstUniqChar("loveleetcode"));
}
public static int firstUniqChar(String s) {
if(s == null){
return -1;
}
Map<Character,Integer> maps = new HashMap<>();
for (int i = 0; i <s.length() ; i++) {
if(maps.containsKey(s.charAt(i))){
maps.put(s.charAt(i),maps.get(s.charAt(i))+1);
}else {
maps.put(s.charAt(i),1);
}
}
for (int i = 0; i <s.length() ; i++) {
if(maps.get(s.charAt(i)) == 1){
return i;
}
}
return -1;
}
}
public int firstUniqChar(String s) {
HashMap<Character, Integer> count = new HashMap<Character, Integer>();
int n = s.length();
// build hash map : character and how often it appears
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
count.put(c, count.getOrDefault(c, 0) + 1);
}
// find the index
for (int i = 0; i < n; i++) {
if (count.get(s.charAt(i)) == 1)
return i;
}
return -1;
}