# Java 26 CodeSignal Interview Guide - Part 2

# 1. First Non-Repeating Character

## Problem
Given a string, return the first character that appears exactly once.

Example

```
aabbccdeeff
```

Output

```
d
```

---

## Solution 1 - LinkedHashMap (Recommended)

```java
public static Character firstUnique(String text) {

    Map<Character,Integer> map = new LinkedHashMap<>();

    for(char c : text.toCharArray()){
        map.merge(c,1,Integer::sum);
    }

    for(var entry : map.entrySet()){
        if(entry.getValue()==1){
            return entry.getKey();
        }
    }

    return null;
}
```

Time: O(n)
Space: O(n)

---

## Solution 2 - HashMap + Second Scan

```java
public static Character firstUnique(String text){

    Map<Character,Integer> map = new HashMap<>();

    for(char c : text.toCharArray()){
        map.merge(c,1,Integer::sum);
    }

    for(char c : text.toCharArray()){
        if(map.get(c)==1){
            return c;
        }
    }

    return null;
}
```

Time: O(n)
Space: O(n)

---

## Solution 3 - Java Streams

```java
public static Character firstUnique(String text){

    Map<Character,Long> count =
            text.chars()
                .mapToObj(c -> (char)c)
                .collect(Collectors.groupingBy(
                        Function.identity(),
                        LinkedHashMap::new,
                        Collectors.counting()));

    return count.entrySet()
            .stream()
            .filter(e -> e.getValue()==1)
            .map(Map.Entry::getKey)
            .findFirst()
            .orElse(null);
}
```

---

## Interview Follow-up

Q: Why LinkedHashMap?

A: It preserves insertion order, allowing us to return the first unique character.

Q: Can it be solved in O(1) space?

A: Yes, if the character set is fixed (e.g. ASCII), using an int[256] frequency array.
