您的位置:首页 > 职场人生

华为上机面试题总结

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

 

我选择是王子题:王子在一个要塌的洞里,王子有魔法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;
}
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息