`
xieboxin
  • 浏览: 4643 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

一道连线面试题

    博客分类:
  • Java
阅读更多
存在行列数未知的二维数组,从上而下连线,一行只可取一个数字,(行-列)为非负数时组合相同数字出现的次数总数最多为 (行-列)+1, 当(行-列)为负数时,一个数字只允许出现一次。
举例说明,如下列数组:

1 2
1 2
1 2

时的组合为:1-2-2, 2-1-1或为1-1-2, 2-2-1,

1 2 3
1 2 3

时,其中一组合为1-2,2-3,3-1,组合不允许出现重复数字。

写出程序。

补充:每行的数字只能出现一次,且行数字出现的总数的差值请保持最小!


有朋友可以写出代码吗?
分享到:
评论
3 楼 xieboxin 2009-11-12  
无成代码如下:

public static void main(String[] args) {
		int row = 4, cell = 8;
		int gap = (row - cell) < 0 ? 1 : (row - cell + 1);
		array = createArray(row, cell);
		LinkedList<Link> links = new LinkedList<Link>();
		Link link;
		Link rollbackLink = null;
		for (int i = 0; i < array[0].length;) {
			link = new Link();
			if (link.add(array[0][i], gap, rollbackLink)) {
				links.addFirst(link);
				i++;
				rollbackLink = null;
			} else {
				rollbackLink = links.removeFirst();
				link.rollBack(rollbackLink);
				i--;
			}
		}

		for (Link link2 : links) {
			System.out.println(link2);
			System.out.println("-----------------------");
		}

	}

	static Integer[][] array;

	private static Integer[][] createArray(int row, int cell) {
		Integer[][] array = new Integer[row][cell];
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < cell; j++) {
				array[i][j] = j;
			}
		}
		return array;
	}

	static class Link {
		// key:数字,value为出现次数
		Map<Integer, Node> lineMap = new HashMap<Integer, Node>();

		private boolean add(Integer begin, int gap, Link link) {
			lineMap.put(begin, new Node(1, 0));
			array[0][begin] = null;
			Node node;
			Integer mark = null;
			boolean end = false;
			boolean rollback = false;
			for (int i = 1; i < array.length;) {
				end = false;
				for (int j = ((!rollback) ? 0 : (mark + 1)); j < array[i].length; j++) {
					rollback = false;
					if (link != null && link.lineMap.containsKey(array[i][j])) {
						continue;
					}
					if (array[i][j] != null) {
						if (lineMap.containsKey(array[i][j])) {
							if (gap > 1) {
								node = lineMap.get(array[i][j]);
								if (node.count < gap) {
									node.addRow(i);
									array[i][j] = null;
									end = true;
									mark = j;
									i++;
									break;
								}
							}
						} else {
							lineMap.put(array[i][j], new Node(1, i));
							array[i][j] = null;
							end = true;
							mark = j;
							i++;
							break;
						}
					}

				}
				if (!end) {
					if (mark != null && mark < array.length) {
						array[i - 1][mark] = mark;
						lineMap.remove(mark);
						rollback = true;
						i--;
					} else {
						return false;
					}
				}
			}
			return true;
		}

		private void rollBack(Link link) {
			if (link != null) {
				Node node;
				for (Integer key : link.lineMap.keySet()) {
					node = link.lineMap.get(key);
					for (Integer integers : node.row) {
						array[integers][key] = key;
					}
				}
			}
		}

		class Node {
			Integer count = 0;
			List<Integer> row = new ArrayList<Integer>();

			public Node(Integer count, Integer row) {
				super();
				this.count = count;
				this.row.add(row);
			}

			private void addRow(Integer row) {
				count = count + 1;
				this.row.add(row);
			}

		}

		public Link() {
			super();
		}

		@Override
		public String toString() {
			StringBuffer string = new StringBuffer();
			Node node;
			for (Integer integers : lineMap.keySet()) {
				node = lineMap.get(integers);
				for (int i = 0, size = node.row.size(); i < size; i++) {
					string.append(node.row.get(i)).append(" - ").append(integers).append("\n");
				}
			}
			return string.toString();
		}

	}



运行结果:(结果仅为二维数组的下标)

3 - 4
2 - 5
1 - 6
0 - 7

-----------------------
2 - 4
3 - 5
0 - 6
1 - 7

-----------------------
1 - 4
0 - 5
3 - 6
2 - 7

-----------------------
0 - 4
1 - 5
2 - 6
3 - 7

-----------------------
3 - 0
2 - 1
1 - 2
0 - 3

-----------------------
2 - 0
3 - 1
0 - 2
1 - 3

-----------------------
1 - 0
0 - 1
3 - 2
2 - 3

-----------------------
0 - 0
1 - 1
2 - 2
3 - 3

-----------------------
2 楼 zl584521 2009-11-12  
没看懂~~
1 楼 330217445 2009-11-12  
把你的例子和文字对应不起来

相关推荐

    经典华为面试题,大家不要错过哦

    【华为面试题】是本文的核心话题,这通常指的是华为公司在招聘过程中可能会问到的问题,涵盖了硬件和软件领域,反映了华为对求职者技能和知识的全面要求。这些面试题旨在评估候选人在技术理解、问题解决、逻辑思维...

    在线考试连线题 js demo

    在线考试连线题是一种常见的考核方式,它要求考生在指定的图形或文字之间建立正确的关联。在Web开发领域,实现这样的功能通常需要利用JavaScript、HTML5和ECMAScript等前端技术。本示例"在线考试连线题 js demo"显然...

    单片机面试题大公司的一些面试题

    单片机面试题大公司的一些面试题 本资源摘要信息涵盖了单片机系统的主要组成模块、数据流流向和控制流流向、单片机应用系统的设计原则、8031与2716的连线图、8051设计键盘加驱动数码管的原理图、PCI总线的含义和...

    html5做连线题

    2. **JavaScript初始化**:在JavaScript中获取canvas元素的2D渲染上下文,并定义一些变量来存储连线题的数据,如题目、答案等。 ```javascript var canvas = document.getElementById('myCanvas'); var ctx = ...

    华为面试题word文档(整理)

    这份名为“华为面试题word文档(整理)”的压缩包包含三份文档,分别是华为C语言笔试题.doc、华为笔试题5.doc和华为Java笔试题.doc,分别针对C语言和Java编程进行了重点考察。以下是对这些知识点的详细阐述: 首先...

    H5+canvas+js实现连线题

    本项目"**H5+canvas+js实现连线题**"就是利用这些技术来创建一种互动式的在线连线题目,这在教育、测试或游戏场景中非常实用。 连线题是一种常见的认知测试形式,通常要求用户将两个相关的项目通过线条连接起来。在...

    Android 连线题,支传图片和文字,简单实用,可做为答题app的连线模块使用

    这个“Android 连线题”项目就是为此目的设计的,它提供了一个简单实用的解决方案,可以方便地集成到你的答题应用程序中,作为连接不同元素的一种互动方式。 首先,我们需要理解Android应用的基本架构。Android应用...

    网络工程师面试题.pdf

    "网络工程师面试题.pdf" 本文档是关于网络工程师面试题的PDF文档,涵盖了各种网络相关的知识点。下面是根据文档中的问题和答案生成的知识点: 交换机的数据转发 交换机通过学习数据帧中的源MAC地址生成交换机的...

    文字连线题模板

    【文字连线题模板】是一种互动教学工具,设计用于帮助学生或参与者通过图形化的方式学习和测试知识。这种类型的题目通常包含一系列的圆圈,每个圆圈内都有一个词汇或概念,用户需要根据提示将相关联的词汇用线段连接...

    Falsh连线题.zip

    《Falsh连线题》是一款基于Flash技术的互动教学课件模板,主要特点是提供了一个连线题的框架,方便教育工作者或内容创作者根据需求进行定制和修改,适用于各个学科的教学辅助。这款模板的核心是FLA源文件,它是Adobe...

    连线题.unitypackage

    源码出处:https://blog.csdn.net/weixin_37013988/article/details/93357934

    精心准备的面试题合集包括中远,华为等公司试题

    这份精心准备的面试题合集是为求职者量身打造的,特别针对中远和华为等知名企业的面试需求。合集中包含了丰富的JAVA和JEE相关知识,旨在帮助求职者全面了解并掌握这些公司在招聘过程中可能考察的技术要点。 首先,...

    HTML5 Cavnas实现连线题特效

    5. 动态连线:在连线题中,通常需要存储每个未完成的连线数据,比如起始点和终点。当用户点击某个起点并开始拖动时,可以通过`mousemove`事件实时更新终点坐标,并在Canvas上临时绘制连线。当鼠标释放(`mouseup`)时...

    软件智力面试题和答案

    【智力面试题与解答】 智力面试题是一种常用于IT行业招聘过程中的测试,旨在考察应聘者的逻辑思维、问题解决和创新能力。以下是对标题和描述中提及的一些问题的详细解析: 1. **计时一个小时十五分钟**:使用三根...

    android 连线题 自定义view 实现

    我们将从标题“android 连线题 自定义view 实现”和描述“Android 连线题 demo以 四个答案为例 通过点击画线 实现连线题 逻辑基本已经写好”中提取关键知识点,并详细介绍如何完成这一功能。 首先,我们需要创建一...

    flash做的连线题

    本主题聚焦于"Flash做的连线题",这是一个非常适合初学者上手的项目,它涉及到ActionScript 3(AS3)编程语言的应用。 首先,我们要了解Flash的界面和基本操作。Flash主要由时间轴、舞台、库和属性面板等部分组成。...

    连线题源码

    flash连线题

    Java设计模式 连线题

    Java设计模式 连线题

    很棒的连线题源码

    很棒的连线题设计制作 flash as2.0制作的连线题,希望能给你带来帮助!

Global site tag (gtag.js) - Google Analytics