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
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].
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.