首页 > 技术文章 > 电话号码分身

16crow 2018-08-30 14:52 原文

题目描述

继MIUI8推出手机分身功能之后,MIUI9计划推出一个电话号码分身的功能:首先将电话号码中的每个数字加上8取个位,然后使用对应的大写字母代替 ("ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"), 然后随机打乱这些字母,所生成的字符串即为电话号码对应的分身。

输入描述

第一行是一个整数T(1 ≤ T ≤ 100)表示测试样例数;接下来T行,每行给定一个分身后的电话号码的分身(长度在3到10000之间)。

输出描述:

输出T行,分别对应输入中每行字符串对应的分身前的最小电话号码(允许前导0)。
示例1

示例1

输入
4
EIGHT
ZEROTWOONE
OHWETENRTEO
OHEWTIEGTHENRTEO

输出
0
234
345
0345

思路:
观察("ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE")
有的字母只在一个单词中出现,比如ZERO,TWO,FOUR,SIX,EIGHT
有点字母在两个或两个以上单词中出现,比如THREE中的H就在THREE和EIGHT中出现
那么只需要统计字母出现的频次就可以计算出每个单词的频次
最后反向计算出原始数字即可

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int row = sc.nextInt();
        sc.nextLine();
        while (row != 0) {
            String s = sc.nextLine();
            s = s.replace(" ", "");
            int[] cache = new int[26];
            char[] cs = s.toCharArray();
            for (char c : cs) {
                cache[c - 'A']++;
            }
            int[] res = new int[10];
            res[0] = cache['Z' - 'A'];
            res[2] = cache['W' - 'A'];
            res[4] = cache['U' - 'A'];
            res[6] = cache['X' - 'A'];
            res[8] = cache['G' - 'A'];
            res[1] = cache['O' - 'A'] - res[2] - res[4] - res[0];
            res[3] = cache['H' - 'A'] - res[8];
            res[5] = cache['F' - 'A'] - res[4];
            res[7] = cache['S' - 'A'] - res[6];
            res[9] = cache['I' - 'A'] - res[6] - res[5] - res[8];
            StringBuilder sb = new StringBuilder("");
            for (int i = 0; i <= 9; i++) {
                while (res[(i + 8) % 10] > 0) {
                    sb.append(i);
                    res[(i + 8) % 10]--;
                }
            }
            System.out.println(sb);
            row--;
        }
    }
}

推荐阅读