当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

编程之美-电话号码对应英语单词

发表于: 2012-08-09   作者:bylijinnan   来源:转载   浏览:
摘要: import java.util.Arrays; public class NumberToWord { /** * 编程之美 电话号码对应英语单词 * 题目: * 手机上的拨号盘,每个数字都对应一些字母,比如2对应ABC,3对应DEF.........,8对应TUV,9对应WXYZ, * 要求对一段数字,输出其代表的所有可能的字母组合

import java.util.Arrays;

public class NumberToWord {

	/**
	 * 编程之美 电话号码对应英语单词
	 * 题目:
     *  手机上的拨号盘,每个数字都对应一些字母,比如2对应ABC,3对应DEF.........,8对应TUV,9对应WXYZ,
     *  要求对一段数字,输出其代表的所有可能的字母组合,如5869,可能代表JTMW、JTMX...
     *  以下程序用DFS得解,但:
	 *  1、程序中输出的单词,是“字母的组合”而已,并不是有真正含义的英文单词
	 *  2、对于含有0和1的电话号码,认为是不合法的输入(因为按键0和1没有对应任何英文字母)
         *  3、2012-11-05 程序中的DFS递归解法,其实和暴力的For循环效率差不多。。。
	 */
	public static void main(String[] args) {
		NumberToWord data = new NumberToWord("234");
		data.numToWord();
	}
	
	private String phoneNumStr;	//字符串格式的电话号码
	private int[] phoneNum;	//数字格式的电话号码
	private int len;	//电话号码的长度
	private char[] result;		//电话号码代表的一个单词
	private static final String[] LETTERS = { 
		"",	  // 0
		"",   // 1
		"ABC",// 2
		"DEF",// 3
		"GHI",// 4
		"JKL",// 5
		"MNO",// 6
		"PQRS",// 7
		"TUV",// 8
		"WXYZ"// 9
	};
	//每个数字按键有几个字母
	private int[] total = { 0, 0, 3, 3, 3, 3, 3, 4, 3, 4 };
	
	public void numToWord() {
		if (phoneNumStr == null || phoneNumStr.length() == 0) {
			System.out.println("phone number is null or empty!");
			return;
		}
		if (!phoneNumStr.matches("[2-9]+")) {
			System.out.println("invalid phone number:" + phoneNumStr);
			return ;
		}
		init();
		dfs(0);
	}
	
	public void dfs(int level) {
		if (level == len) {
			System.out.println(Arrays.toString(result));
			return;
		}
		int num = phoneNum[level];
		String str = LETTERS[num];
		int size = total[num];
		char[] letters = str.toCharArray();
		for (int i = 0; i < size; i++) {
			result[level] = letters[i];
			dfs(level + 1);
		}
	}

	public NumberToWord(String phoneNumStr) {
		this.phoneNumStr = phoneNumStr;
	}
	
	//change "234"(String) to {2, 3, 4}(int[])
	private void init() {
		int len = phoneNumStr.length();
		this.len = len;
		phoneNum = new int[len];
		result = new char[len];
		char[] letters = phoneNumStr.toCharArray();
		for (int i = 0; i < len; i++) {
			phoneNum[i] = letters[i] - '0';
		}
	}
}

编程之美-电话号码对应英语单词

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号