`
jsczxy2
  • 浏览: 1258478 次
  • 性别: Icon_minigender_1
  • 来自: 常州
文章分类
社区版块
存档分类
最新评论

数据结构与算法:手机上每个数字对应几个字母,给你一串数字,请你输出所有可能的字符串(树结构处理)

阅读更多

题目:手机上每个数字对应几个字母,给你一串数字,请你输出所有可能的字符串

 

 

 

 

package com.test;

import java.util.ArrayList;
import java.util.List;


/**
 * @author jsczxy2
 *
 */
public class TestTelNumber {
	
	public static void main(String[] args) {
		String str = "154767";
		Node node = new Node(' ');
		char cs[] = str.toCharArray();
		for(char c : cs){
			addNodes(node,c);
		}
		order(node);
		
	}
	
	public static void order(Node node){
		//如果有子节点继续遍历子节点
		if(node.hasChildren()){
			List<Node> children = node.getChildren();
			for(Node nd : children){
				order(nd);
			}
		}else{
			//如果没有子节点也就是一次数字的完成,直接打印出该子节点一直到根节点的路径
			StringBuffer sb = new StringBuffer();
			Node me = node;
			while(true){
				if(me.getParent()!=null){
					sb.append(String.valueOf(me.getC()).trim());
					me = me.getParent();
				}else{
					break;
				}
			}
			System.out.println(sb.reverse().toString());
		}
	}
	
	public static void addNodes(Node node,char c){
		//没有子节点直接赋予子节点
		if(!node.hasChildren()){
			node.setChildren(createNodes(String.valueOf(c),node));
		}else{
			//有子节点遍历子节点继续递归每个子节点
			List<Node> children = node.getChildren();
			for(Node nd : children){
				addNodes(nd,c);
			}
		}
	}
	
	//根据number创建子节点
	public static List<Node> createNodes(String number,Node parent){
		List<Node> list = new ArrayList<Node>();
		if("0".equals(number)){
			list.add(new Node(' ',parent));
		}else if("1".equals(number)){
			list.add(new Node(' ',parent));
		}else if("2".equals(number)){
			list.add(new Node('a',parent));
			list.add(new Node('b',parent));
			list.add(new Node('c',parent));
		}else if("3".equals(number)){
			list.add(new Node('d',parent));
			list.add(new Node('e',parent));
			list.add(new Node('f',parent));
		}else if("4".equals(number)){
			list.add(new Node('g',parent));
			list.add(new Node('h',parent));
			list.add(new Node('i',parent));
		}else if ("5".equals(number)){  
			list.add(new Node('j',parent));  
			list.add(new Node('k',parent));  
			list.add(new Node('l',parent));  
        } else if ("6".equals(number)){  
            list.add(new Node('m',parent));  
            list.add(new Node('n',parent));  
            list.add(new Node('o',parent));  
        } else if ("7".equals(number)){  
            list.add(new Node('p',parent));  
            list.add(new Node('q',parent));  
            list.add(new Node('r',parent));  
            list.add(new Node('s',parent));  
        } else if ("8".equals(number)){  
            list.add(new Node('t',parent));  
            list.add(new Node('u',parent));  
            list.add(new Node('v',parent));  
        } else if ("9".equals(number)){  
            list.add(new Node('w',parent));  
            list.add(new Node('x',parent));  
            list.add(new Node('y',parent));  
            list.add(new Node('z',parent));  
        } 
		return list;
	}
	
}

class Node{
	
	private char c;
	
	private List<Node> children = new ArrayList<Node>();
	
	private Node parent = null;
	
	public Node(char c) {
		this.c = c;
	}
	
	public Node(char c,Node parent) {
		this.c = c;
		this.parent = parent;
	}

	public char getC() {
		return c;
	}

	public void setC(char c) {
		this.c = c;
	}

	public List<Node> getChildren() {
		return children;
	}

	public void setChildren(List<Node> children) {
		this.children = children;
	}
	
	public Node getParent() {
		return parent;
	}

	public void setParent(Node parent) {
		this.parent = parent;
	}

	public boolean hasChildren(){
		return this.children.size()>0?true:false;
	}
}
分享到:
评论

相关推荐

    c程序设计习题参考(谭浩强三版)习题参考解答

    8.8编写一函数,有实参传来一个字符串,统计此字符串中字母,数字,空格和其它字符的个数,在主函数中输入字符串以及输出上述的结果。 52 8.10写一函数,用“起泡法”对输入的10个字符按由小到大的顺序排列。 54 ...

    上海电机学院C语言实训答案

    (5)编写一个程序实现如下功能:从键盘输入字符(最多为80个),遇到回车键输入结束,将输入的字符串按奇偶位置拆分,奇数位上的字符在前,偶数位上的字符在后,重新组成新的字符串输出,例如输入: ab12cd3456fg,...

    数据结构(C++)有关练习题

    &lt;br&gt;实验四 综合(课程设计) 内容及步骤: 1、假定一维数组a[n]中的每个元素值均在[0,200]区间内,用C++编写一个算法,分别统计出落在[0,20],[21,50],[51,80],[81,130],[131,200]等各区间内的元素...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    角色是一组权限的集合,将角色赋给一个用户,这个用户就拥有了这个角色中的所有权限。  系统预定义角色 预定义角色是在数据库安装后,系统自动创建的一些常用的角色。下面我们就简单介绍些系统角色:  CONNECT...

    c/c++ 学习总结 初学者必备

    答: 编译器自动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。 14、 static有...

    javascript入门笔记

    特点:将 a 和 b 先转换为二进制,按位操作,对应位置上的两个数字,相同时,该位整体结果为0,不同时,该位的整体结果为 1 使用场合:快速交换两个数字 5 ^ 3 101 011 ========== 110 结果为 6 练习: ...

    WinRAR_4.0.exe

    这个文件包含下列字符串: switches=任何 RAR 开关,用空格分开 例如: switches=-m5 -s 环境变量 可以通过建立"RAR"环境变量来添加默认参数到命令行中. 例如,在 UNIX 中,下列命令行可以被添加到你的...

    中文简体压缩软件RAR 6.0

    这个文件包含下列字符串: 开关=&lt;任何 RAR 开关,用空格分开&gt; 环境变量 ~~~~~~~~ 可以通过建立"RAR"环境变量来添加默认参数到命令行中. 例如,在 UNIX 中,下列命令行可以被添加到你的配置中: ...

    Oracle9i的init.ora参数中文说明

    说明: 指定一个字符串值, 设置 TIME 数据类型的默认值, 该数据类型包含 HOUR, MINUTE 和 SECOND 这几个日期时间字段。 语法: TIME '09:26:50' (将值存储为 7 个字节)。 默认值: 从 NLS_TERRITORY 中获得 nls_time...

    达梦数据库_SQL语言手册

    因此在嵌入方式下,除了数据查询语句一次查询一条记录外,还有几种与游标 有关的语句: 游标的定义、打廾、关闭、拨动语句 游标定位方式的数据修改与删除语句。 为了有效维护数据库的完整性和一致性,支持 的并发...

    rar压缩软件.rar

    这个文件包含下列字符串: switches=任何 RAR 开关,用空格分开 例如: switches=-m5 -s 环境变量 ~~~~~~~~ 可以通过建立"RAR"环境变量来添加默认参数到命令行中. 例如,在 Unix 中,下列命令行可以被...

    C程序范例宝典(基础代码详解)

    本书全面介绍了应用C语言进行开发的各种技术和技巧,全书共分12章,内容包括基础知识、指针、数据结构、算法、数学应用、文件操作、库函数应用、图形图像、系统调用、加解密与安全性、游戏、综合应用等。全书共提供...

    C#全能速查宝典

    分别介绍了C#语言基础、Windows窗体及常用控件、Windows高级控件、控件公共属性、方法及事件、数据库开发、文件、数据流与注册表、GDI+绘图技术和C#高级编程,共包含562个C#编程中常用的属性、方法、类和各种技术,...

    C语言程序设计标准教程

    Hello 函数是一个无参函数,当被其它函数调用时,输出Hello world字符串。 2.有参函数的一般形式 类型说明符 函数名(形式参数表) 型式参数类型说明 { 类型说明 语句 }  有参函数比无参函数多了两个内容,其...

Global site tag (gtag.js) - Google Analytics