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

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

发表于: 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

    震惊

    震惊

编辑推荐
问题: 电话的号码盘一般可以用于输入字母,如用2可以输入a,b,c,用3可以输入d,e,f等。 对于号码5869
3、题目:能否快速找出一个数组(简单起见,数组中元素值各不一样)中的两个数字,让这两个数字之和
今天开始看编程之美 。第一个问题是CPU的使用率控制,微软的问题果然高大上,我一看就傻了,啥也不
第一章 软件架构是什么 软件架构应该... asoftware architect that the system should be friendly
给定一个前序和中序变量的结果,写一个算法重建这棵树:如: 前序: a b d c e f 中序: d b a e c f
还好看到了,这个以前好早见到过。 用得是辗转相除法。 k =x/y b=x%y 则 x = ky+b 如果一个整数能够
题目:编写一个函数,把一个char组成的字符串循环右移n位。例如:原来是”abcdefghi”,如果n = 2,
Windows中有一项功能,是可以在任务管理器中查看CPU的使用率,管理器以图形使用率在不同的时间点的
一 年又很快过去了,今年从之前的设计师转型到Android程序员。期间也经历了许多的坎坎坷坷,从一个
编程之美:平面最近点对 一.概念引入 最接近点对问题的提法是:给定平面上n个点,找其中的一对点,使
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号