All challenges
Easy 0 solved 0% acceptance

One-Hot Encoding

Turn categories into vectors with a single 1, the input format for classifiers and embeddings.

What you'll learn

  • Map categories to vector positions
  • Build one-hot rows for each label
  • Prepare categorical data for models

Problem

Models need numbers, not words. One-hot encoding turns each category into a vector with one position per category: 1 at the category's position and 0 everywhere else.

Order the categories alphabetically. For each label, output its one-hot vector.

Implement one_hot(labels).

Input

labels: A list of category names.

Output

Return a matrix with one row per label and one column per distinct category (alphabetical order).

Constraints

1 ≤ length ≤ 1,000

Each label is 1 to 20 characters

Examples

Example 1
Input:
labels = ["red", "green", "blue", "green"]

Expected output:
expected = [
    [0, 0, 1],
    [0, 1, 0],
    [1, 0, 0],
    [0, 1, 0]
]
Input:
std::vector<std::string> labels = {"red", "green", "blue", "green"};

Expected output:
std::vector<std::vector<long long>> expected = {
    {0, 0, 1},
    {0, 1, 0},
    {1, 0, 0},
    {0, 1, 0}
};
Input:
string[] labels = new string[] {"red", "green", "blue", "green"};

Expected output:
long[][] expected = new long[][] {
    new long[] {0, 0, 1},
    new long[] {0, 1, 0},
    new long[] {1, 0, 0},
    new long[] {0, 1, 0}
};

Explanation

The categories in alphabetical order are blue, green, red. So red → [0, 0, 1], green → [0, 1, 0] and blue → [1, 0, 0].

Example 2
Input:
labels = ["yes"]

Expected output:
expected = [
    [1]
]
Input:
std::vector<std::string> labels = {"yes"};

Expected output:
std::vector<std::vector<long long>> expected = {
    {1}
};
Input:
string[] labels = new string[] {"yes"};

Expected output:
long[][] expected = new long[][] {
    new long[] {1}
};

Explanation

There is only one category, so every vector is [1].

How to approach it

Try on your own first, then open one hint at a time.

Hint 1

Find the distinct categories first, then sort them alphabetically to define the column order.

Hint 2

For each label, place a 1 only in the column matching that label and 0 everywhere else.

Hint 3

Make sure duplicate labels produce identical rows, since the output has one row per input label.

Expected complexity

O(n log k) time, O(nk) extra space

References

This challenge is adapted for CodeUtility. Follow the statement and constraints above.

Learn from others

Community solutions

No published solutions yet. Solve this challenge to share the first one.