LeetCode 423. Reconstruct Original Digits from English解题笔记

本文介绍了一种LeetCode题目解决方案,即从乱序的英文描述中恢复原始数字顺序。文章详细阐述了解题思路,包括如何通过关键字母定位特定数字及其出现次数,并提供了一种高效简洁的Java实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 题目描述

https://leetcode.com/problems/reconstruct-original-digits-from-english/#/description

Given a non-empty string containing an out-of-order English representation of digits 0-9, output the digits in ascending order.

Note:
Input contains only lowercase English letters.
Input is guaranteed to be valid and can be transformed to its original digits. That means invalid inputs such as “abc” or “zerone” are not permitted.
Input length is less than 50,000.
Example 1:
Input: “owoztneoer”

Output: “012”
Example 2:
Input: “fviefuro”

Output: “45”
Subscribe to see which companies asked this question.

2. 基本思路

本质上这道题目是把出现的几个数字通过英文表示,然后打乱顺序,之后再让我们找出这些原始的数据。本质上就是找规律的过程
这里写图片描述
通过图示的关键字母,通过三轮我们一定可以找出各个数字的出现次数

3. 实现代码

struct DATA{
    string alphaNum_;
    int num_;

    DATA(){}
    DATA(string alphaNum, int num) :alphaNum_(alphaNum), num_(num){}
};

class Solution {
public:
    string originalDigits(string s) {
        vector<int> vecs(26, 0);
        for (auto item : s){
            vecs[item - 'a']++;
        }

        vector<int> nums(10, 0);
        vector<vector<char>> keyNums{ { 'z', 'w', 'u', 'x', 'g' },
            { 'o', 'r', 'f' }, { 's', 'i' }
        };
        for (size_t k = 0; k < keyNums.size(); k++){
            for (size_t i = 0; i < keyNums[k].size(); i++){
                while (vecs[keyNums[k][i] - 'a'] > 0){
                    for (size_t j = 0; j < keymap_[keyNums[k][i]].alphaNum_.size(); j++){
                        vecs[keymap_[keyNums[k][i]].alphaNum_[j] - 'a']--;
                    }
                    nums[keymap_[keyNums[k][i]].num_]++;
                }
            }
        }
        string res;
        for (size_t i = 0; i < nums.size(); i++)
            res += string(nums[i], i + '0');
        return res;
    }

protected:
    static map<char, DATA> keymap_;
};

map<char, DATA> Solution::keymap_{ 
    make_pair<char, DATA>('z', DATA(string("zero"), 0)),
    make_pair<char, DATA>('o', DATA(string("one"), 1)),
    make_pair<char, DATA>('w', DATA(string("two"), 2)),
    make_pair<char, DATA>('r', DATA(string("three"), 3)),
    make_pair<char, DATA>('u', DATA(string("four"), 4)),
    make_pair<char, DATA>('f', DATA(string("five"), 5)),
    make_pair<char, DATA>('x', DATA(string("six"), 6)),
    make_pair<char, DATA>('s', DATA(string("seven"), 7)),
    make_pair<char, DATA>('g', DATA(string("eight"), 8)),
    make_pair<char, DATA>('i', DATA(string("nine"), 9))
};

运行效果:
这里写图片描述

4. 示例代码

https://discuss.leetcode.com/topic/63386/one-pass-o-n-java-solution-simple-and-clear

public String originalDigits(String s) {
    int[] count = new int[10];
    for (int i = 0; i < s.length(); i++){
        char c = s.charAt(i);
        if (c == 'z') count[0]++;
        if (c == 'w') count[2]++;
        if (c == 'x') count[6]++;
        if (c == 's') count[7]++; //7-6
        if (c == 'g') count[8]++;
        if (c == 'u') count[4]++; 
        if (c == 'f') count[5]++; //5-4
        if (c == 'h') count[3]++; //3-8
        if (c == 'i') count[9]++; //9-8-5-6
        if (c == 'o') count[1]++; //1-0-2-4
    }
    count[7] -= count[6];
    count[5] -= count[4];
    count[3] -= count[8];
    count[9] = count[9] - count[8] - count[5] - count[6];
    count[1] = count[1] - count[0] - count[2] - count[4];
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i <= 9; i++){
        for (int j = 0; j < count[i]; j++){
            sb.append(i);
        }
    }
    return sb.toString();
}

思想是类似的,都是去寻找关键字符特征。但是这种方法的好处是,不需要定义太复杂的数据结构,求解简单明了
这个算法相比于我们算法,省略了对数组的运算操作因而效率更高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值