微众java岗笔试题解
三角形数字
直接找出公式,套就完事
package com.weizhong; import java.io.*; import java.util.*; import java.text.*; import java.math.*; import java.util.regex.*; public class Main1 { /*请完成下面这个函数,实现题目要求的功能 当然,你也可以不按照下面这个模板来作答,完全按照自己的想法来 ^-^ ******************************开始写代码******************************/ static String GetResult(int N) { int s = 0; for (int i = 1; i < 1000000; i++) { s += i; if (s >= N) { int total = i + 1; int sub = 0; if ( i % 2 == 0) { sub = i - (s-N); } else { sub = s - N + 1; } return String.valueOf(sub) + "/" + String.valueOf(total- sub); } } return null; } /******************************结束写代码******************************/ public static void main(String[] args){ Scanner in = new Scanner(System.in); String res; int _N; _N = Integer.parseInt(in.nextLine().trim()); res = GetResult(_N); System.out.println(res); } }
正方形
笨法子,从6到1放
654都是1个正方形一部车,5塞满1,4先塞2,没满再塞1
3复杂些,用最后一部车的剩余空间来塞2跟1,也是先塞2再塞1
2的最后一部车空位塞1
1直接塞
package com.weizhong; import java.util.Scanner; public class Main2 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int[] arr = new int[6]; for (int i = 0; i < 6; i++) { arr[i] = in.nextInt(); } int ret = 0; if (arr[5] > 0) { ret += arr[5]; } if (arr[4] > 0) { ret += arr[4]; arr[0] -= 11*arr[4]; } if (arr[3] > 0) { ret += arr[3]; if (arr[1] >= 5* arr[3]) { arr[1] -= 5* arr[3]; } else { arr[0] -= 4*(5*arr[3] - arr[1]); arr[1] = 0; } } if (arr[2] > 0) { if (arr[2] % 4 == 0) { ret += arr[2] / 4; } else { ret += arr[2] / 4 + 1; int s = arr[2] % 4; if (s == 1) { if (arr[1] >= 5) { arr[1] -= 5; arr[0] -= 7; } else { arr[0] -= 27-4*arr[1]; arr[1] = 0; } } else if (s == 2) { if (arr[1] >= 3) { arr[1] -= 3; arr[0] -= 6; } else { arr[0] -= 18 - 4*arr[1]; arr[1] = 0; } } else { if (arr[1] >= 1) { arr[1] -= 1; arr[0] -= 5; } else { arr[0] -= 9; } } } } if (arr[1] > 0) { if (arr[1] % 9 == 0) { ret += arr[1] / 9; } else { ret += arr[1] / 9 + 1; arr[0] -= (arr[1] % 9) * 4; } } if (arr[0] > 0) { if (arr[0] % 36 == 0) ret += arr[0] / 36; else ret += arr[0] / 36 + 1; } System.out.println(ret); } }
膨胀圆
这题复杂一点,重点是把圆抽象出一个类,然后再计算,思路会清晰些
过程:
初始每个圆的半径都为0
对所有圆两两求相遇时间(这里注意如果有一个是停止膨胀的圆,时间要x2)
找到最早相遇的两个圆,以及相遇时间,将这两个圆停止膨胀
更新所有圆的半径
重复上述过程,直到所有圆都停止膨胀
复杂度O(n^3),不知道有没有更好的算法
也许可以往图的方向去想
package com.weizhong; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main3 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); List<Node> list = new ArrayList<>(); for (int i = 0; i < n; i++) { float x = in.nextFloat(); float y = in.nextFloat(); list.add(new Node(x, y)); } int running = list.size(); while (running > 0) { float minDis = Float.MAX_VALUE; int a = -1; int b = -1; for (int i = 0; i < list.size() - 1; i++) { for (int j = i + 1; j < list.size(); j++) { float dis = Node.timeToMeet(list.get(i), list.get(j)); if (dis < minDis) { minDis = dis; a = i; b = j; } } } for (int i = 0; i < list.size(); i++) { Node node = list.get(i); if (!node.isStop) node.setR(node.getR() + minDis); } Node n1 = list.get(a); Node n2 = list.get(b); if (!n1.isStop) { n1.setStop(true); running--; } if (!n2.isStop) { n2.setStop(true); running--; } } for (int i = 0; i < list.size() -1; i++) { System.out.printf("%.3f ", list.get(i).getR()); } System.out.printf("%.3f", list.get(list.size()-1).getR()); } } class Node { float x; float y; float r; boolean isStop; public Node(float x, float y) { this.x = x; this.y = y; r = 0; isStop = false; } public static float distance(Node n1, Node n2) { return (float)Math.sqrt((n1.x - n2.x)* (n1.x - n2.x) + (n1.y -n2.y) * (n1.y - n2.y)); } public static float timeToMeet(Node n1, Node n2) { if (n1.isStop() && n2.isStop()) { return Float.MAX_VALUE; } else if (n1.isStop() || n2.isStop) { return (distance(n1, n2) - n1.r - n2.r); } else { return (distance(n1, n2) - n1.r - n2.r) / 2; } } public float getX() { return x; } public void setX(float x) { this.x = x; } public float getY() { return y; } public void setY(float y) { this.y = y; } public float getR() { return r; } public void setR(float r) { this.r = r; } public boolean isStop() { return isStop; } public void setStop(boolean stop) { isStop = stop; } }#题解##笔试题目#