【编程题m_0030】电话号码分身(小米2017秋招真题)

题目描述:继MIUI8推出手机分身功能之后,MIUI9计划推出一个电话号码分身的功能:首先将电话号码中的每个数字加上8取个位,然后使用对应的大写字母代替("ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"),

然后随机打乱这些字母,所生成的字符串即为电话号码对应的分身。

输入

 

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

 

样例输入

4

EIGHT

ZEROTWOONE

OHWETENRTEO

OHEWTIEGTHENRTEO

输出

 

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

 

样例输出

0

234

345

0345

解题思路:“EIGHT”到“SEVEN”中,字母和数字存在一一对应关系的有:[G-8,Z-0,W-2,U-4,X-6],将其作为第一批次的判断条件;剩下的,存在一一对应关系的有:[T-3,F-5],将其作为第二批次的判断条件;再剩下的,存在一一对应关系的有:[I-9,O-0,S-7],将其作为第三批次的判断条件;

package BiShiTi;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

/**
 * 解题思路:“EIGHT”到“SEVEN”中,字母和数字存在一一对应关系的有:[G-8,Z-0,W-2,U-4,X-6],将其作为第一批次的判断条件;
 * 剩下的,存在一一对应关系的有:[T-3,F-5],将其作为第二批次的判断条件;
 * 再剩下的,存在一一对应关系的有:[I-9,O-0,S-7],将其作为第三批次的判断条件;
 */
public class m_0030 {
	private static final String [] TRANSARR = {"EIGHT", "NINE", "ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN"};
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int T = Integer.valueOf(sc.nextLine());//样例数
		String [] simple = new String[T];
		for (int i = 0; i < T; i++) {
			simple[i] = sc.nextLine().trim();
		}
		for (int i = 0; i < T; i++) {
			System.out.println(decodeStr(simple[i]));
		}
	}
	
	private static void deleteStr(StringBuffer oriStr, String tarStr){
		for (int i = 0; i < tarStr.length(); i++) {
			oriStr.deleteCharAt(oriStr.indexOf(String.valueOf(tarStr.charAt(i))));
		}
	}
	private static String decodeStr(String _strAfter){
		StringBuffer strAfter = new StringBuffer(_strAfter);
		List<Integer> listBefore = new LinkedList<Integer>();
		StringBuffer strBefore = new StringBuffer();
		
		while (strAfter.indexOf("G") != -1
			|| strAfter.indexOf("Z") != -1
			|| strAfter.indexOf("W") != -1
			|| strAfter.indexOf("U") != -1
			|| strAfter.indexOf("X") != -1) {
			
			if (strAfter.indexOf("G") != -1) {
				deleteStr(strAfter, TRANSARR[0]);
				listBefore.add(0);
			}else if (strAfter.indexOf("Z") != -1) {
				deleteStr(strAfter, TRANSARR[2]);
				listBefore.add(2);
			}else if (strAfter.indexOf("W") != -1) {
				deleteStr(strAfter, TRANSARR[4]);
				listBefore.add(4);
			}else if (strAfter.indexOf("U") != -1) {
				deleteStr(strAfter, TRANSARR[6]);
				listBefore.add(6);
			}else {
				deleteStr(strAfter, TRANSARR[8]);
				listBefore.add(8);
			}
		}
		
		while (strAfter.indexOf("T") != -1
			|| strAfter.indexOf("F") != -1) {
				
			if (strAfter.indexOf("T") != -1) {
				deleteStr(strAfter, TRANSARR[5]);
				listBefore.add(5);
			}else {
				deleteStr(strAfter, TRANSARR[7]);
				listBefore.add(7);
			}
		}
		
		while (strAfter.indexOf("I") != -1
			|| strAfter.indexOf("O") != -1
			|| strAfter.indexOf("S") != -1) {
				
			if (strAfter.indexOf("I") != -1) {
				deleteStr(strAfter, TRANSARR[1]);
				listBefore.add(1);
			}else if (strAfter.indexOf("O") != -1) {
				deleteStr(strAfter, TRANSARR[3]);
				listBefore.add(3);
			}else {
				deleteStr(strAfter, TRANSARR[9]);
				listBefore.add(9);
			}
		}
		
		Collections.sort(listBefore);
		for (int i = 0; i < listBefore.size(); i++) {
			strBefore.append(listBefore.get(i));
		}
		return strBefore.toString();
	}	

}

 

转载于:https://my.oschina.net/MasterLi161307040026/blog/1842413

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值