---
# System prepended metadata

title: \#387 First Unique Character in a String
tags: [leetcode, leetcode-easy]

---

# \#387 First Unique Character in a String
## *給定一字串s, 回傳在s裡"第一個只出現過一次"的字元的index*
## Log
 - build 20210718 by syhuang
 
## 解法3
 - 用javascript indexOf() + lastIndexOf()方法
 - leetcode submit結果 空間約20%, 時間約90%(空間使用大,但速度較快)
 ```javascript=
 var firstUniqChar = function(s) {
    let result = -1;
    try{
        s.split('').forEach(function(value,index){
            if(s.indexOf(value) == s.lastIndexOf(value)){
                result = index;
                throw {};
            }
        });
    }catch{};
    return result;
};
 ```

## 解法2
 - 用一陣列紀錄a-z的出現頻率, 然後再依序遍歷一次s, 回傳第一個出現一次的字元index
 - leetcode submit結果, 空間<10%, 時間>90%(空間使用大,但速度較快)
```javascript=
var firstUniqChar = function(s) {
    let freq = new Array(26).fill(0);//紀錄a-z每個字元出現的次數(預設0次)
    const A_CODE_INDEX_REF = 'a'.charCodeAt();//編碼基準點
    let result = -1;
    s.split('').forEach(function(value,index){
        freq[value.charCodeAt()-A_CODE_INDEX_REF]++;
    });
    try{
        s.split('').forEach(function(value,index){
            if(freq[value.charCodeAt()-A_CODE_INDEX_REF]===1){
                result = index;
                throw {};
            }
        });
    }catch{}
    return result;
};
```
## 初見
 - 對s跑迴圈, 用map紀錄每個字元的出現次數, 然後對map遍歷, 找到第一個只出現過一次的字元, 最後找到這個字元在s中的位置
 - leetcode submit結果, 空間9x%, 時間<10%(空間使用少,但速度慢)
```javascript=
var firstUniqChar = function(s) {
    let letters = new Map();//key紀錄字元, value紀錄出現次數
    for(let i=0; i<s.length; i++){
        const c = s[i];
        let count;
        if(letters.has(c)) count = letters.get(c);
        else count = 0;
        letters.set(c,count+1);
    }
    let result = '';
    //使用try...catch來實現forEach的break效果
    try{
        letters.forEach(function(value,key){
            if(value===1){
                result=key;
                throw {};
            }
        });
    }catch{}
    return result==''?-1:s.indexOf(result);
};
```
## 備註
- 在javascript的forEach()方法, 使用try...catch實作類似迴圈的break效果
## 參考
- [forEach()實現continue/break效果](https://dotblogs.com.tw/supershowwei/2020/10/19/094424)
###### tags: `leetcode`, `leetcode-easy`