# \#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`