根据乱序的英文单词构成数字

Reconstruct Original Digits from English

问题:

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

Note:

  1. Input contains only lowercase English letters.
  2. 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.
  3. Input length is less than 50,000.

Example 1:

Input: "owoztneoer"
Output: "012"

Example 2:

Input: "fviefuro"
Output: "45"

解决:

【题意】给定0~9的英文的乱序字符串,将其解析为数字,并升序输出。

① 

观察0-9的英文"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",

可以发现一些字母只在某一个单词中出现,如z,w,u,x,g这5个单词,分别只出现在zero,two,four,six,eight中,那么这五个数字的个数就可以被确定了;

由于含有o的单词有zero,two,four,one,其中前三个都被确定了,那么one的个数也就知道了;

由于含有t的单词有two,three,eight,其中two,eight个数已知,那么three的个数就知道了;

由于含有f的单词有four,five,其中four个数已知,那么five的个数就知道了;

由于含有s的单词有six,seven,其中six个数已知,那么seven的个数就知道了;

由于含有i的单词有six,eight,five,nine,其中前三个都被确定了,那么nine的个数就知道了,知道了这些问题就变的容易多了,

我们按这个顺序"zero", "two", "four", "six", "eight", "one", "three", "five", "seven", "nine"就能找出所有的个数了。

class Solution { //293ms
    public String originalDigits(String s) {
        int[] hash = new int[26];
        for (char c : s.toCharArray()){
            hash[c - 'a'] ++;
        }
        int[] digits = new int[10];//标识0~9的个数
        digits[0] = hash['z' - 'a'];//只有0的英文包含z
        digits[2] = hash['w' - 'a'];
        digits[4] = hash['u' - 'a'];
        digits[6] = hash['x' - 'a'];
        digits[8] = hash['g' - 'a'];

        digits[1] = hash['o' - 'a'] - digits[0] - digits[2] - digits[4];
        digits[3] = hash['t' - 'a'] - digits[2] - digits[8];
        digits[5] = hash['f' - 'a'] - digits[4];
        digits[7] = hash['s' - 'a'] - digits[6];
        digits[9] = hash['i' - 'a'] - digits[5] - digits[6] - digits[8];
        String res = "";
        for (int i = 0;i <= 9;i ++){
            while (digits[i] > 0){
                res += i;
                digits[i] --;
            }
        }
        return res;
    }
}

② 跟上面的差不多,但是时间差很多。。

class Solution { //12ms
    public String originalDigits(String s) {
        if (s == null || s.length() == 0) {
            return "";
        }
        int[] hash = new int[128];
        for (char c : s.toCharArray()) {
            hash[c] ++;
        }
        int[] nums = new int[10];
        nums[0] = hash['z'];
        nums[2] = hash['w'];
        nums[4] = hash['u'];
        nums[6] = hash['x'];
        nums[8] = hash['g'];

        nums[3] = hash['h'] - nums[8];
        nums[1] = hash['o'] - nums[2] - nums[4] - nums[0];
        nums[5] = hash['f'] - nums[4];
        nums[7] = hash['s'] - nums[6];
        nums[9] = hash['i'] - nums[5] - nums[6] - nums[8];
        StringBuilder res = new StringBuilder();
        for (int i = 0; i < 10; i++) {
            for (int j = 1; j <= nums[i]; j ++) {
                res.append(i);
            }
        }
        return res.toString();
    }
}

转载于:https://my.oschina.net/liyurong/blog/1601473

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值