记2019.9.7华为机试

昨天参加了华为机考,今天将其记录一下,顺便总结一下不足。
第一题:给一个数组,从位置0开始,求第一步可到达跳【1,length/2)步,接着每一步的步数是当前数组元素的的大小,问跳到数组的最后一个元素最少要多少步?
eg
[1,2,3,4,5,6,7,8]
第一步:从1跳3步到arr[3]
第二步:3+arr[3]=3+4=7 到达末尾
结果:最少两步

当时的解题思路:还挺简单,直接用暴力,求第一个位置到终点所需的步数求,再求第二个到终点所需的步数,一直求到length/2-1时,所需的步数,然后比较最小不就好了吗?不对,这可是华为!一定不会这么简单,让我再想一想。嗯,既然求最小,那一定是要考察动态规划了,要用到动态规划,那一定是要求状态转移了,既然状态转移,一定要用集合来存储当前的状态和下一步的状态了,嗯,对,一定是这样。我用record_now集合来存储当前状态,用record_next集合存储下一个状态,这样只要在每次跳之前看看有没有当前的终点就好了?于是我写出了如下代码:

public static int getMinStep(int []arr){
	HashSet<Integer> record_now=new HashSet<>();   //用来记录当前到达的状态
	HashSet<Integer> record_next=new HashSet<>();  //用来记录下一步的状态
	
	//第一步,跳到i
	for(int i=1;i<arr.length/2;i++){
		record_now.add(i);
	}
	int step=1;   //当前跳的步数
	//接着跳
	while(!record_now.isEmpty()){
		//location:当前位置,跳到下一次位置 location+arr[location]
		for(Integer location:record_now){
			//如果下一步可达,记录下一步的状态
			if(location+arr[location]<arr.length){
				record_next.add(location+arr[location]);
			}
		}
		//将下一次的状态设置为当前状态,当前状态清空,步数+1
		record_now.clear();
		record_now.addAll(record_next);
		record_next.clear();
		
		step++;
		//判断是否有直接跳到终点的
		if(record_now.contains(arr.length-1)){
			return step;
		}
	}
	//当所有状态都结束,但是没有到达终点的,return -1;
	return -1;		
}

测试结果:通过60%,部分测试用例因为耗时太长,通不过???
想不通原因,那我还是用暴力法来看看吧:

public static int getMinStep(int []arr){
	int min=arr.length;  //最大步数
	//第一步,跳到i,判断从i要几步到终点
	for(int i=1;i<arr.length/2;i++){
		int tmp=minSearch(i,arr);
		if(tmp<min){
			min=tmp;
		}
	}
	//如果min值被改变,说明有的点到达了最后,而且此时的min值为最少步数,返回
	if(min!=arr.length){
		return min;
	}
	else{
		return -1;
	}
}

public static int minSearch(int i,int []arr){
	int step=1;
	int location=i;    //当前位置
	
	//还在数组中
	while(location<arr.length){
		location=location+arr[location];
		step++;
		//如果到达终点
		if(location==arr.length-1){
			return step;
		}
	}
	//如果没有到达终点,返回原始min值
	return arr.length;
}

通过了!??

分析:
1.为什么第一次没通过,而用暴力法直接通过了呢?我分析了可能的原因是:第一次我使用的动态规划思想在可能在本题中并不适用,因为动态规划和暴力法在时间复杂度上是一样的O(N^2)。可是至于为什么会这么耗时,动态规划不就是空间换时间吗?时间不应该更低吗?我也弄不清楚了。其实我反而觉得用动态规划是更好的。可能是个玄学问题???

2.使用动态规划的好处是能够提前终止(发现有到达终点的状态就终止),同一个状态不会多次计算(比如arr[3]=2,arr[4]=1都到达5,5在HashSet中只会存储一次),而暴力需要计算所有的结果比较一遍。其实就像图的遍历一样,动态规划用的是BFS,而暴力使用的是DFS,关键是DFS并不能记录重复的路径,它可能一条路走N次;而BFS不会走重复路径,而且有到了终点就停止。

事后反思:由于动态规划没有通过所有的测试用例,所以在这道简单题上花费了一个多小时,直接导致后面的题目都没做出来,唉······

第二题:给两个数M,N,M表示M中元素(1,2,3…),N表示N个成环,元素可重复使用,要求顺序和逆序都算同一种,如{(1,2,3)(2,3,1)(3,1,2)(3,2,1) (2,1,3)(1,3,2)}都算同一种,问有多少种组成的环?

给出样例 M=3 N=3    结果:10
(1,1,1)(1,1,2)(1,1,3)(1,2,2)(1,2,3)(1,3,3)(2,2,2)(2,2,3)(2,3,3)(3,3,3)

当时的解题思路:这既然是一个排列组合问题,那么结果和M,N之间一定有某种数学关系,难道华为要考察我的数学水平?凭借我高中数学的水平,我应该能把这种数学关系求出来,结果,时间结束了,我还是没把这个关系算出来。。。

考试结束,我又想了一下,既然没有把F(M,N)=f(M,N)算出来,要不如,画个表,找找规律,结果,果然发现了一些规律。
在这里插入图片描述
于是我大胆猜测:F(M,N)=F(M-1,N)+F(M,N-1)
证明:以F(2,2)为例
在这里插入图片描述
分析:首先F(2,2)肯定是包含F(1,2)这种情况的,然后对于F(2,1)->F(2,2)其实是环增加一个元素,然后不要与F(1,2)冲突,不与F(1,2)冲突,环就必须增加一种不与F(1,2)中M种元素相同的元素才可以保证。对于加入的位置,由于成环,并且正逆序算作同一种,其实对于F(2,1)中的某个环,无论加到哪个位置,得到的N种最后都是同一种,所以F(2,1)中全新的(2,2)环,加上之前的(1,2)环,总共可以得到F(2,2)=F(1,2)+F(2,1)种(2,2)环。
同理:可得F(M,N)=F(M-1,N)+F(M,N-1)。(F(M,1)=M;F(1,N)=1)
理清思路,代码就很好写了:

public static int getResult(int M,int N){
   	 int [][]record=new int[M+1][N+1];
   	 
   	 //行初始化
   	 for(int j=1;j<N+1;j++){
   		 record[1][j]=1;
   	 }
   	 //列初始化
   	 for(int i=1;i<M+1;i++){
   		 record[i][1]=i;
   	 }
   	 //赋值
   	 for(int i=2;i<M+1;i++){
   		 for(int j=2;j<N+1;j++){
   			 record[i][j]=record[i-1][j]+record[i][j-1];
   		 }
   	 }
   	 //返回结果
   	 return record[M][N];
}

算法时间复杂度(O(M*N))

第三题:我题目都没来得及看(菜的真实),希望有谁能分享一下第三题的问题和解题思路。

总体来说,这次笔试并不是很顺利,主要问题还是在第一题上花费了太多时间,没有将时间分配好;至于为什么在第一题上花费了太多时间,还是经验不够,需要多加练习。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 华为_结构与材料_机试题目.txt是华为公司在面试中给候选者出的结构与材料方面的机试题目。这道题目的具体内容可能涉及材料的物理性能、结构设计与优化、材料的合成与制备等方面。 对于这样的机试题目,候选者可能需要具备扎实的材料学基础和结构设计的能力。首先,候选者需要具备对材料物理性能的了解,并能准确描述材料的力学性能、导热性能、电磁性能等指标。其次,候选者需要能够应用材料的力学性能和特性来设计各种结构,如承重结构、隔热结构等。此外,候选者还需要掌握材料的制备和加工方法,以及材料的表征和测试技术。 针对这道题目,候选者可以首先进行材料的分析,找出材料的组成和结构特点。然后可以根据题目中的需求,设计出一个合适的材料结构。接下来,候选者可以讨论材料结构的制备方法,选择适当的材料制备工艺,并说明其优缺点。最后,候选者可以对材料结构进行性能测试和评估,分析材料结构的优劣之处,并提出可能的优化方案。 总之,华为_结构与材料_机试题目.txt是一道考察候选者对结构与材料领域知识和应用能力的试题。候选者需要通过对材料性能和结构特点的分析,并结合材料的制备方法和表征技术,来设计一个合适的材料结构并评估其性能。 ### 回答2: 华为_结构与材料_机试题目.txt是一份题目文件,涉及华为公司关于结构与材料方面的机试题目内容。根据题目文件的名称,可以推测这些题目主要涉及到华为公司在结构与材料方面的相关知识。 华为作为一家全球知名的通信设备和手机制造商,对于结构与材料的应用具有丰富的经验与实践。因此,这份机试题目文件很有可能涉及到以下方面的内容: 1. 结构设计原理:涉及到通信设备和手机等产品的结构设计原理,包括机械设计、热力学原理、材料力学等方面的知识。 2. 材料选择与应用:讨论在通信设备和手机制造过程中,如何选择合适的材料,以及不同材料的特性、优缺点及应用领域。 3. 结构与材料工艺:介绍通信设备和手机制造过程中所用到的结构与材料加工工艺,包括模具设计、铸造、成型、焊接、表面处理等。 4. 材料性能测试与分析:考察如何对通信设备和手机所使用的材料进行性能测试与分析,以确保产品质量和稳定性。 5. 新材料与新技术应用:探讨通信设备和手机行业中新材料和新技术的应用,以及对产品性能和用户体验的影响。 在参加这份机试题目时,考生需要具备相关的结构与材料知识,并且能够运用所学知识分析和解决实际问题。准备参加此次机试的考生可以通过复习相关教材、参加练习题和模拟考试等方式来提升自己的准备水平。 ### 回答3: 华为_结构与材料_机试题目.txt是一个描述华为公司的结构和材料的机试题目。这道题目的目的是考察考生对华为公司结构和材料的认知和理解。 华为公司的结构包括总公司、子公司和分支机构等。总公司位于深圳,在全球多个国家和地区设有子公司和分支机构。华为的组织结构非常严密,各部门之间协同合作,形成了高效的运营模式。公司内部分为市场与销售、产品开发、生产制造、供应链管理、人力资源等部门,每个部门都拥有相应的职能和责任,并通过有效的沟通和信息共享实现协同工作。 华为的主要产品包括手机、通信设备、电脑和消费电子产品等。这些产品都采用了优质的材料,以确保产品的质量和性能。华为关注材料的环保性和可持续发展,致力于使用可再生材料和降低对环境的影响。同时,华为也注重材料的创新和研发,不断推出具有竞争力的新产品。 除了产品材料,华为还注重供应链材料的管理和控制。公司与供应商建立了长期稳定的合作关系,深入合作,共同致力于提供高品质的材料。华为通过质量管理体系和严格的供应商审核,确保供应链材料的稳定性和可靠性。 总之,华为公司的结构和材料是公司成功的重要因素之一。通过高效的组织结构和优质的材料,华为不断推出具有竞争力的产品,为用户提供卓越的体验。公司还重视可持续发展和环境保护,努力实现材料的环保和创新。这种结构和材料的管理和控制为华为赢得了广泛的市场认可和用户信赖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值