`
phpxer
  • 浏览: 71703 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

答复: 上个星期去腾讯面试一位主考官出的动脑题,当时被难住了

阅读更多
如果是智商题,根本就不应该想算法这回事。我看以后大家如果遇到这样的问题,问问是在考算法还是考智商。

hanjiangit 写道

你这方法还是不行 用得还是穷举法  而且你预设了数组值为0 完全是掌握结果后再来写的 不能用数学方法解释

我也写了个算法实现,是用穷举,但是运算过程中逐步向正确结果收敛,有效降低了循环次数。从数学方法上完全可以解释(穷举)。运算大概18ms。没有上面WonderfulCounter快。

不过可读性还好,有人能够帮忙再优化一下么?

算法实现如下:

/*
 一共有上下两排数,上排的十个数是【0,1,2,3,4,5,6,7,8,9】
针对上排的每个数,在其对应的下面位置填写一个数,该数表示上面的数在下面出现的次数。

####################
数值:0,1,2,3,4,5,6,7,8,9
分配:6,2,1,0,0,0,1,0,0,0
比如说,
0的下面我填写6,就表示在下面一共有6个0.
1的下面我填写2,表示下面下面一共有2个1
2的下面我填写1,表示下面下面一共有1个2
这回能看明白? 
 */

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 */
public class NumberRowCaculator {

	public static void main(String[] args) throws Exception {
		int[] row1 = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

		long start = System.currentTimeMillis();

		NumberRowCaculator r = new NumberRowCaculator(row1);
		r.caculate();
		for (NumberRow number : r.getNumbers())
			System.out.println(number);

		System.out.println(System.currentTimeMillis() - start);
	}

	List<NumberRow> numbers = new ArrayList<NumberRow>();
	final int[] firstRow;

	public NumberRowCaculator(int[] firstRow) {

		this.firstRow = firstRow;

		for (int i = 0; i < firstRow.length; i++) {
			NumberRow n = new NumberRow(firstRow.length);
			n.setBit(0, i);
			numbers.add(n);
		}
	}
	
	public void caculate() throws Exception {
		this.calculator();
		this.clearErrorRows();
	}

	public List<NumberRow> getNumbers() {
		return numbers;
	}

	/**
	 * 计算出所有满足与原始列的各个对应数字乘积之和不大于最大数字个数的行
	 * @throws CloneNotSupportedException
	 */
	private void calculator() throws CloneNotSupportedException {

		for (int bitposition = 1; bitposition < this.firstRow.length; bitposition++) {

			List<NumberRow> temp = new LinkedList<NumberRow>();
			Iterator<NumberRow> it = numbers.iterator();
			while (it.hasNext()) {
				NumberRow n = it.next();
				for (int value = 0; value < firstRow.length; value++) 
					if (n.check(bitposition, value, firstRow)) {
						NumberRow added = (NumberRow) n.clone();
						added.setBit(bitposition, value);
						temp.add(added);
					}
			}
			numbers = temp;
		}
	}

	/**
	 * 清理不完全满足条件的行
	 */
	private void clearErrorRows() {
		List<NumberRow> temp = new LinkedList<NumberRow>();
		for (NumberRow number : numbers) {
			boolean v = true;
			for (int i = 0; i < firstRow.length && v; i++) {
				if (!number.validate(i, firstRow[i])) {
					v = false;
					break;
				}
			}
			if (v)
				temp.add(number);
		}
		this.numbers = temp;
	}

}

/**
 * 具体某一行对象
 *
 */
class NumberRow {

	private final int[] rows;

	public NumberRow(int length) {
		super();
		this.rows = new int[length];
	}

	/**
	 * 检查设置新数字后是否满足与原始行对应数字乘积之和不大于最大长度
	 * @param index 要插入的位置
	 * @param value 要插入的数字的值
	 * @param firstRow 原始行
	 */
	public boolean check(int index, int value, int[] firstRow) {
		int c = 0;
		for (int i = 0; i < rows.length; i++) {
			c += (firstRow[i] * rows[i]);
		}
		c += firstRow[index] * value;

		return c <= firstRow.length;
	}

	public void setBit(int index, int value) {
		this.rows[index] = value;
	}

	public boolean validate(int index, int value) {
		int c = 0;
		for (int i = 0; i < rows.length; i++)
			if (rows[i] == value)
				c++;

		return c == rows[index];
	}

	protected Object clone() throws CloneNotSupportedException {
		NumberRow n = new NumberRow(this.rows.length);
		for (int i = 0; i < rows.length; i++)
			n.rows[i] = rows[i];
		return n;
	}

	@Override
	public String toString() {
		StringBuilder s = new StringBuilder();
		for (int i = 0; i < rows.length; i++)
			s.append(rows[i]).append(",");
		return s.toString();
	}

}

分享到:
评论

相关推荐

    公务员面试主考官引导语 .doc

    【公务员面试主考官引导语】是面试过程中至关重要的一环,它不仅标志着面试的开始,也为应聘者设置了面试的规则和氛围。以下是基于这个主题详细展开的知识点: 1. **面试开场与气氛设定**:主考官的引导语首先应该...

    外企面试必备 关于回答主考官问题

    在准备外企面试时,如何有效地回答主考官的问题至关重要。面试不仅是展示你的专业技能和经验的舞台,更是展现个人魅力、沟通能力和适应性的重要环节。以下是一些关键知识点: 首先,自我介绍是面试的开场白,务必...

    我是主考官之面试故事

    在IT行业中,面试是筛选合适人才的关键环节,而“我是主考官之面试故事”则是一份关于面试过程、技巧和经验分享的资料。这份资料可能是由一位有经验的面试官或者HR专家编撰,旨在帮助求职者和面试官更好地理解和应对...

    【公务员面试学习资料】2014年江苏省公务员面试考官题本.docx

    根据给定文件的信息,我们可以提炼出以下几个重要的知识点: ### 1. 社会感知能力 #### 背景介绍 老周作为一名行政服务中心的服务窗口工作人员,面对一位因为材料不全而不得不多次往返的市民,采取了一种贴心的...

    面试考官培训课件

    面试考官培训课件主要涵盖了人才测评的重要工具——面试,以及如何有效进行结构化面试的组织...综上所述,面试考官培训课程旨在提高面试的科学性和有效性,通过系统学习和实践,面试官可以更好地选拔出适合企业的人才。

    面试-自我推荐-就业\向主考官提出的10个漂亮的问题

    根据给定文件的信息,我们可以提炼出与面试、自我推荐及就业相关的10个问题的关键知识点。这10个问题旨在帮助求职者更好地了解目标公司及其文化,并展示求职者的积极性和专业性。 ### 1. 公司的主要业务方向是什么...

    2021年HCIE数通面试题库,HCIE面试宝典题库面试新增项目新题已更新完整版

    1、面试时间一小时,一人一个小屋里面一台笔记本带摄像头,考官2-3位 2、面试三道题,登录考试电脑后自动页面展示 3、可以自己选择下答题顺序,由易到难,推荐边说边画图及txt记录答题思路 放平心态调整好,2021年...

    面试时十个可反问主考官的问题

    本文将根据给定的标题“面试时十个可反问主考官的问题”及其描述,深入探讨在面试过程中可以向面试官提出的关键问题,这些问题有助于求职者更好地评估自己是否适合该职位及公司。 ### 1. 公司对于这个职位的主要...

    【2013-15年腾讯校园招聘】腾讯产品策划类笔试面试题整理

    ### 产品策划类笔试面试题解析 #### 一、腾讯产品策划类笔试题解析 **题目解析:** 1. **列出腾讯的十款产品及其竞争对手的产品,并选择一款进行评价,指出其优缺点及改进建议。** - **产品列表及竞争对手:** ...

    2021年江西省公务员考试备考资料:公务员精选面试题1000道及答案定义.pdf

    "2021年江西省公务员考试备考资料:公务员精选面试题1000道及答案定义.pdf" 基于提供的文件信息,我们可以总结出以下几个关键知识点: 1. 面试的考察手段:面试过程中,主考官通过向应试者提出各种问题,观察应试...

    面试技巧:26个面试经典问题回答.pdf

    "面试技巧:26个面试经典问题回答" 本文将对面试技巧的26个经典问题回答进行详细分析和解释,并提供相应的回答提示和样本,以帮助求职者更好地准备面试。 问题1:请你自我介绍一下自己好吗? 回答要点:企业最...

    考官送的一份前端工程师面试题

    【前端工程师面试题详解】 作为前端工程师,掌握扎实的基础知识和实践经验是至关重要的。这份面试题涵盖了前端开发的多个核心领域,包括HTML、CSS、JavaScript、浏览器工作原理、性能优化以及现代前端框架等内容。...

    精选面试题1000道及答案

    3. 双向沟通:面试不仅仅是主考官对应试者的单向考察,也是一个互动的过程。应试者可以通过面试了解招聘单位和岗位信息,判断自己是否适合。主考官则需要通过应试者的反应调整面试策略,确保获取有价值的信息。 4. ...

    3个CCIE考官对一个高级网络工程师的面试题.doc

    面试官是三位CCIE,面试过程历时2个多小时,印象非常深刻。现在这个offer基本已经确定了,事主还在考虑诸如待遇及工作压力等情况再决定是否接这个offer.事主亦在其blog上张贴了面试题目,我故亦斗胆将其贴出。

    C#面试题 C#面试考官经常会问的问题

    C#面试题总结 本资源总结了C#面试中常见的问题和答案,涵盖了C#基础知识、面向对象编程、事件处理、委托、索引器、算法等多方面的知识点。 1. ASP.NET 页面之间传递值的方式 在 ASP.NET 中,有多种方式可以在页面...

    公务员录用面试细则及考官评分表.docx

    7. **面试规则**:应试者由工作人员引领进入面试室,面试过程中主考官提问,可以是一问一答或抽签回答。面试时间通常为30分钟,至少25分钟用于问、答。面试过程中,对主考官、考官、应试者和其他人员都有具体的行为...

    招聘主考官破解面试三道坎.doc

    招聘主考官破解面试三道坎.doc

    作程序面试考官与工作人员职责和操作程序.doc

    - 送收面试题,收集考官评分表,提醒考官填写考生序号。 - 复核评分,计算考生最后得分,填写汇总表,修正错误。 - 负责面试计时,及时提醒考生面试时间。 6. 监督员职责: - 对整个面试过程进行监督,确保程序...

    自己整理的公务员面试试题及参考答案.doc

    2. 在面试时,不要说出自己的姓名、准考证号等信息,以免被取消面试资格。 3. 不要带任何通讯工具到面试地点,一旦被发现,也会被取消面试资格。 4. 在侯考室及休息室里,需要听从管理人员的安排,不要擅自行动,...

Global site tag (gtag.js) - Google Analytics