---
# System prepended metadata

title: 字串中的第一個唯一字元(First Unique Character in a String)
tags: [' LeetCode', Data Structure I]

---

---
tags: Data Structure I, LeetCode
disqus: HackMD
---

# 字串中的第一個唯一字元(First Unique Character in a String)

## 虛擬碼

```pseudocode=
function bubble_sort (array, length) {
    var i, j;
    for(i from 0 to length-1){
        let com_a = nums[i];
        for(j from i+1 to length-1){
            if (array[j] === com_a)
                true
        }
    }
    false
}
```

## 解題

[387. First Unique Character in a String](https://leetcode.com/problems/first-unique-character-in-a-string/description/?envType=study-plan&id=data-structure-i)

### 題目說明

給定一個字串，找到其中的第一個非重複字元並返回其索引。如果不存在，則傳回 。s-1

![](https://i.imgur.com/4ZRkUTJ.png)

### 解法

第一種
**Javascript**

```javascript=
/**
 * @param {string} s
 * @return {number}
 */

const firstUniqChar = (s) => {
    const map = new Map()
    for(let letter of s)
        !map.has(letter) ? map.set(letter,1) : map.set(letter,-1)
    for (let item of map)
        if (item[1] === 1) return s.indexOf(item[0])
    return -1
};

```

第二種 [失敗範例]
```javascript=
/**
 * @param {string} s
 * @return {number}
 */
var firstUniqChar = function(s) {
    let no = 0;
    for (let i = 0; i < s.length; i ++) {
        for (let j = i+1; j < s.length; j ++) {
            let fir = ""; //第一個
            let sec = ""; //下一個
            fir = s[i];
            sec = s[j];
            if (fir !== sec) {
                no += 0;
            } else {
                no += 1;
            }
            console.log(i + fir + ',' + j + sec + ',' + no);
        }
        if (no == 0) {
            return i;
        } else {
           no += 0; 
        }
    }
    return -1;
};
```

### chatGPT解說

首先，這段程式碼使用了箭頭函式 (arrow function) 的語法，定義了一個名為 firstUniqChar 的函式，這個函式接收一個字串 s 作為參數。接下來，這個函式建立了一個空的 Map 物件，這個 Map 物件的目的是要存儲字串中每個字母出現的次數。

程式碼接下來使用了 for...of 的語法來迭代字串 s，對於字串中的每一個字母 letter，程式碼檢查 Map 物件中是否已經存在該字母，如果存在，就將其對應的值減一，表示這個字母出現了多次；如果不存在，就將其對應的值設定為 1，表示這個字母出現了一次。

接著，程式碼使用 for...of 的語法來迭代 Map 物件。對於 Map 物件中的每一個元素 item，進行判斷，如果這個元素的值等於 1，表示這個字母只出現了一次，那麼程式碼就回傳在原字串 s 中該字母的索引值，使用 indexOf 方法可以找到該字母在字串中第一次出現的位置。如果程式碼迭代完整個 Map 物件，仍然沒有找到只出現了一次的字母，那麼函式就回傳 -1，表示在原字串中沒有任何不重複的字母。

總結來說，這段程式碼使用 Map 物件來統計字串中每個字母出現的次數，然後再使用 Map 物件來找到第一個只出現一次的字母。程式碼中使用了 for...of 的語法來迭代字串和 Map 物件，這種語法相對於 for 循環更為簡潔，也更容易讀懂。
