iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 28
0
自我挑戰組

[LeetCode with JavaScript] 一起來刷 LeetCode吧 ~~~ (ノ>ω<)ノ系列 第 28

[LeetCode with JavaScript] Day 28: First Unique Character in a String

  • 分享至 

  • xImage
  •  

觀前提醒:

  1. 我預設大家已經先思考並分析過題目,沒啥想法才開始 google 找解題靈感。若無,建議每題先花 1~2 顆番茄鐘的時間來分析題目比較好。可參考番茄鐘工作法
  2. 承上,既然已經有思考過了,那我這邊直接 po 題目 + 解題想法 + code +心得 。若已經在 code 內有足夠的註解了,那我可能解題想法 & 心得的部分就不會寫太多,免得干擾你的思考。
  3. 所有解法都是已經取得系統的 Accepted,但或許不是最優解法,請多包涵。
  4. 若對於解法不太懂,可以嘗試用 Chrome 的 debugger 來試跑看看 (教學文)
  5. 最後,歡迎在下面留言指教~教學相長才會進步歐~/images/emoticon/emoticon41.gif

題目

Given a string, find the first non-repeating character in it and return its index. If it doesn't exist, return -1.

Examples:

s = "leetcode"
return 0.

s = "loveleetcode"
return 2.

Note: You may assume the string contains only lowercase English letters.

解題想法

直接破題:這題是找到字符串第 1 次出現長度為 1 的字串,且給定的字串都是英文小寫。
所以一開始我們可以利用 Dynamic Programing 的概念,採取以下步驟解題:

  1. 先創造一個空的 map。
  2. 再歷遍字串中每個字元,並記錄其出現次數。
  3. 搜尋 map 中,第一次出現次數為 1 的字元,並回傳其位置。

CODE

/**
 * @param {string} s
 * @return {number}
 */
var firstUniqChar = function (s) {
  //創造一個空的 map
  let frequencies = new Map();
  // 把 result 的預設值設定為 -1(題目要求)
  let result = -1;
  // 歷遍字串中每個字元,並記錄其出現次數。
  for (let char of s) {
    if (frequencies[char] === undefined) {
      frequencies[char] = 1;
    } else {
      frequencies[char]++;
    }
  }
  // 搜尋 map 中,第一次出現次數為 1 的字元,並回傳其位置。
  for (let i = 0; i < s.length; i++) {
    let char = s.charAt(i);
    if (frequencies[char] === 1) {
      return i;
    }
  }
  return result;
};

心得

這題需要掌握住的內建物件 & 語法如下:

看完註解 + 上述相關資料後,這題應該就會變得不太困難才對~/images/emoticon/emoticon01.gif


謝謝大家的收看,LeetCode 小學堂我們下次見~/images/emoticon/emoticon29.gif


上一篇
[LeetCode with JavaScript] Day 27: Pascal's Triangle
下一篇
[LeetCode with JavaScript] Day 29: Merge Two Sorted Lists
系列文
[LeetCode with JavaScript] 一起來刷 LeetCode吧 ~~~ (ノ>ω<)ノ30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言