华为上机面试题总结

这篇博客分享了作者在华为面试时遇到的上机题目,包括括号正确性判断和王子逃跑问题。作者强调了解题思路的重要性,并对自己的算法和数据结构能力进行了反思,表示会继续努力提升。博客内容并未提供完整的解题代码,但提醒读者这可能涉及华为的面试题,如有问题会删除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

去华为面试,到那里,直接去上机。然后从他们的题库中抽取两道题,其中一题是:判断括号的正确性,比如“()(())”这个是正确的。另一题是,王子逃跑题。

 

我选择是王子题:王子在一个要塌的洞里,王子有魔法M,一次闪烁60米耗时1秒,消耗10点魔法值,只有在静止的时候一秒恢复4点魔法值,王子跑的速度是17m/s。问王子逃出去的最短时间,或者不能逃出去,最远能跑多远。其中  距离是S,塌陷时间是T。其中,S=0,已经逃出去,T=0,则逃不出去。

M、S、T可以当成参数传递,不是固定的值。

我当时的思路有问题,从而导致没有写出来。昨天我理清思路,花费一些时间把代码code出来。下面代码有优化的地方,在此不在优化。

总结:

1、碰到问题时,不要着急,思路很重要,先把题理解清楚最重要。

2、不得不说,自己确实是菜鸟。有关算法或者是数据结构方面太菜。

3、努力加强自己。记录下来,共勉

 

PS:我没有上网搜,不知道有没有答案,如果泄露了华为的题,请通知,我立刻删除。这段代码,我没有做详细的测试,没有做详细的判断。仅供自己参考。

 

public class PrinceEscape {
	
	private final static float speed = 17;
	
	private final static float jump_range = 60;
	
	private final static float use_mana = 10;
	
	private final static float recover_mana = 4;
	
	private static int recoverMana(int mana) {
		if (mana >= 10) {
			return 0;
		} else {
			float r = use_mana - mana;
			return (int) Math.ceil(r/recover_mana);
		}
	}
	
	public static void main(String[] args) {
		Result s = judge(0, 200, 11);
		System.out.println(s.getType()+"===="+s.getTime()+"==="+s.getRange());
	}
	
	/**
	 * 判断使用逃跑方式
	 * @param m 剩余mana值
	 * @param s 剩余距离
	 * @param t	剩余时间
	 * @return Result
	 */
	public static Result judge(int m, int s, int t) {
		int qTime = 0;
		int mana = 0;
		Result result = new Result();
		
		if (s <= 0) {
			result.setRange(0);
			result.setTime(0);
			result.setType(1);
			System.out.println("已经逃出!");
			return result;
		} 
		
		if ( m < 10 ) {
			qTime = recoverMana(m);
			mana =(int) (m + qTime * recover_mana);
		} else {
			if (s < jump_range) {
				result.setRange(s);
				result.setTime(1);
				result.setType(1);
				System.out.println("用跳,一秒逃出");
				return result;
			}
			System.out.println("用跳,一次");
			Result r = judge(mana-10, s-60, t-1);
			result.setType(r.getType());
			result.setTime(1 + r.getTime());
			result.setRange(60+r.getRange());
			return result;
		}
		qTime += 1;
		if (qTime < t) {
			int runRange = (int) (speed * qTime);
			if (runRange >= s) {
				System.out.println("用跑,一次");
				result.setRange(s);
				result.setTime((int)Math.ceil(s/speed));
				result.setType(1);
				return result;
			} else if (s <= jump_range) {//可以跳出去
				result.setRange(s);
				result.setTime(qTime);
				System.out.println("用跳,一次");
				result.setType(1);
				return result;
			} else {
				// 此时,闪烁的距离是60m。跑的距离是runRange
				if (runRange < jump_range) {
					System.out.println("用跳,一次");
					Result r = judge(mana-10, s-60, t-qTime);
					result.setType(r.getType());
					result.setTime(qTime + r.getTime());
					result.setRange(60+r.getRange());
					return result;
				} else {
					// 此时,应该判断第二次使用闪烁时,需要多少时间恢复mana,然后再比较一次,看看用哪一种形式。
					// 当m是,0、1、2、3的时候,恢复mana时间是3秒,加上跳的一秒是四秒,68大于60,而此时还没有跳完。
					m = mana - 10;
					t = t-qTime;
					int qTime1 = recoverMana(m)+1;
					// 此时跳跃2次,120m
					// runRange += 17*qTime
					// 然后再判断,S的距离,时间,如果时间大于t,则只能用跑,如果不大于,再比较距离
					if (t < qTime1) {
						System.out.println("用跑,一次");
						Result r = judge(m, s-runRange, t);
						result.setRange(runRange + r.getRange());
						result.setTime(qTime + r.getTime());
						result.setType(r.getType());
					} else {
						runRange += speed * qTime1;
						if (runRange >= s) {
							System.out.println("用跑,一次");
							Result r = judge(m, s-runRange, t-qTime1);
							result.setRange(runRange + r.getRange());
							result.setTime(qTime + r.getTime()+qTime1);
							result.setType(1);
						} else {
							System.out.println("用跳,一次");
							Result r = judge(m, s-60, t);
							result.setRange(60 + r.getRange());
							result.setTime(qTime + r.getTime());
							result.setType(r.getType());
						}
					}
					return result;
				}
			}
		} else {
			if (speed * t < s) {
				System.out.println("不能逃出");
				result.setType(2);
				result.setRange(17*t);
				result.setTime(t);
			} else {
				System.out.println("可以逃出");
				result.setRange(s);
				result.setTime((int)Math.ceil(s/speed));
				result.setType(1);
			}
			return result;
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值