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