本文共 3341 字,大约阅读时间需要 11 分钟。
今年Google笔试用Code Jam。今天试试怎么用。这东西很威武啊,支持各种语言,只要免费许可的都可以,还可以下载别人提交的code。做了几个非常简单的,结果就遇到坑了。
第一道题很简单,将一些字母数字的组合翻译成十进制,类似IEEE754的float格式。需要注意的是,使得到的数字最小,则首位字符对应0,第2个与首位不同的字符对应0。
public long readFormat(String s) { int[] map = new int[256]; int used = 0; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (map[c] == 0) { used++; map[c] = used; } } int radix = used; if (radix == 1) radix = 2; long ret = 0; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); int num = map[c]; if (num == 1) { } else if (num == 2) { num = 0; } else { num--; } ret *= radix; ret += num; } return ret;}void run() { int COUNT = sc.nextInt(); for (int c = 0; c < COUNT; c++) { String s = sc.next(); System.out.println(String.format("Case #%d: %d", c + 1, readFormat(s))); }}
第二道是几何问题,也不难。最后计算长度的时候遇到问题。这个长度可以用速度乘以时间算出来,同时这个长度也是直角三角形的一个边,也可以根据勾股定律用另两条边求出来。我按照第一个方法提交失败,按照第二个方法,就成功了。
class Pos { double x, y, z; public Pos() { } public Pos(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } public void add(Pos p) { this.x += p.x; this.y += p.y; this.z += p.z; } public void divide(double d) { this.x /= d; this.y /= d; this.z /= d; } public double multiply(Pos p) { return this.x * p.x + this.y * p.y + this.z * p.z; } public Pos multiply(double d) { this.x *= d; this.y *= d; this.z *= d; return this; } public double getDistanceSqare() { return x * x + y * y + z * z; } public double getDistance() { debug(getDistanceSqare()); return sqrt(getDistanceSqare()); }}class Fly { Pos p = new Pos(); Pos v = new Pos(); public void add(Fly fl) { p.add(fl.p); v.add(fl.v); } public void divide(int d) { p.divide(d); v.divide(d); } @Override public String toString() { return "x: " + p.x + " y: " + p.y + " z: " + p.z + " vx: " + v.x + " vy: " + v.y + " vz: " + v.z; }}void run() { int COUNT = sc.nextInt(); for (int c = 0; c < COUNT; c++) { int cc = sc.nextInt(); Fly center = new Fly(); for (int i = 0; i < cc; i++) { Fly fl = new Fly(); fl.p.x = sc.nextInt(); fl.p.y = sc.nextInt(); fl.p.z = sc.nextInt(); fl.v.x = sc.nextInt(); fl.v.y = sc.nextInt(); fl.v.z = sc.nextInt(); center.add(fl); } center.divide(cc); debug(center); double dotResult = -center.p.multiply(center.v); double distance = 0; double time = 0; if (dotResult <= Double.MIN_VALUE) { distance = center.p.getDistance(); } else { double vDisSqare = center.v.getDistanceSqare(); time = dotResult / vDisSqare; distance = center.p.getDistanceSqare() - center.v.getDistanceSqare() * time * time; if (distance < 0) distance = 0; else distance = sqrt(distance); } System.out.println(String.format("Case #%d: %.8f %.8f", c + 1, distance, time)); }}
转载地址:http://ytasa.baihongyu.com/