去华为面试,到那里,直接去上机。然后从他们的题库中抽取两道题,其中一题是:判断括号的正确性,比如“()(())”这个是正确的。另一题是,王子逃跑题。
我选择是王子题:王子在一个要塌的洞里,王子有魔法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;
}
}
}
。