美团笔试 Java
1. AC, 输入 n 个点的坐标,求出所有满足: 该点上下左右都有点,的点
5. n个数据, & 结果为0 就输出 1, 否则没有和该数 & 结果为 0 的就输出 -1, 超时了 18%
#423美团笔试题##笔试题目#
import java.util.*; /** * @author xx * @data 4/23/20 6:47 PM */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); List<point> list = new ArrayList<>(); sc.nextLine(); for (int i = 0; i < n; i++) { String str = sc.nextLine(); String[] t = str.split(" "); list.add(new point(Integer.parseInt(t[0]), Integer.parseInt(t[1]))); } int count = 0; for (int i = 0; i < n; i++) { point cur = list.get(i); boolean up = false, down = false, left = false, right = false; for (int j = 0; j < n; j++) { if (j == i) { continue; } point cur2 = list.get(j); if (cur2.x == cur.x) { if (cur2.y > cur.y) { up = true; } if (cur2.y < cur.y) { down = true; } } if (cur2.y == cur.y) { if (cur2.x > cur.x) { right = true; } if (cur2.x < cur.x) { left = true; } } } if (up && down && left && right) { count++; } } System.out.println(count); } } class point{ int x; int y; public point(int x, int y) { this.x = x; this.y = y; } }
2. AC, 输入 一些 数,按照要求格式输出, 有整数, 负整数,小数,负小数,0
// 三位一个 逗号 整数部分 从后向前 隔三位补 逗号 // 小数两位, 够了直接舍掉, 不够补足, // $ 转换完了加 $ // 负数, 再加上括号,去掉负号
import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * @author xx * @data 4/23/20 7:47 PM */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); List<String> list = new ArrayList<>(); while (sc.hasNextLine()) { String cur = sc.nextLine(); if (cur.isEmpty()) { break; } list.add(cur.trim()); } // List<String> result = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { // 三位一个 逗号 // 小数两位, 直接舍掉 // 负数, 先转化, 再加上括号,省略负号 // $ String cur = list.get(i); System.out.println(trans(cur)); } } private static String trans(String cur) { StringBuffer sb = new StringBuffer(""); boolean isFuShu = cur.charAt(0) == '-' ? true : false; if (isFuShu) { cur = cur.substring(1); } // 小数,整数,负整数,负小数或者零 if (cur.indexOf('.') != -1) { // 小数 sb = xiao(cur); } else { sb = zheng(cur); sb.append(".00"); } if (isFuShu) { sb.insert(0, '('); sb.append(')'); } return String.valueOf(sb); } private static StringBuffer xiao(String cur) { int dianIndex = cur.indexOf('.'); int len = cur.length(); String tail; if (dianIndex == len - 1) { tail = "00"; } else if (dianIndex == len - 2) { tail = cur.substring(dianIndex) + '0'; } else { tail = cur.substring(dianIndex, dianIndex + 3); } StringBuffer left = zheng(cur.substring(0, dianIndex)); left.append(tail); return left; } private static StringBuffer zheng(String cur) { StringBuffer res = new StringBuffer(cur); int count = 0; for (int j = cur.length() - 1; j >= 0; j--) { count++; if (count == 3 && j != 0) { res.insert(j, ','); count = 0; } } res.insert(0, '$'); return res; } }
3. 没看
4. 最优购买策略: 贪心把, n个产品 k 个人 每个产品有两个属性 price 和 id (1表示A产品,2表示B产品), 策略: 只买B 不打折, 买了(只要存在A) A 最便宜那个半价,求最少花多少钱
哭泣,不知道哪里错了 18%
import java.awt.*; import java.util.Comparator; import java.util.PriorityQueue; import java.util.Scanner; /** * @author chenhong * @data 4/23/20 6:47 PM */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(), k = sc.nextInt(); int[] arr = new int[n]; // n 物品数量 sc.nextLine(); PriorityQueue<Point> pq = new PriorityQueue<>(new Comparator<Point>() { @Override public int compare(Point point, Point point2) { if (point.y == point2.y) { return point2.x - point.x; } else { return point.y - point2.y; } } }); for (int i = 0; i < n; i++) { pq.add(new Point(sc.nextInt(), sc.nextInt())); } int count = 0; Point cur = pq.poll(); while (k > 1 && !pq.isEmpty() && cur.y == 1) { // 优先队列,在还剩下不止一个人的并且还有产品并且这个产品是A产品的时候,每一个人都只买A产品,这样都能打半价 if (cur.x % 2 == 0) { count += cur.x / 2; } else { count += cur.x / 2 + 0.5; } cur = pq.poll(); k--; } // 不满足: k==1, pq 空 ; cur.y == 2 if (cur.y == 2) { // 不能半价了 count += cur.x; while (!pq.isEmpty()) { count += pq.poll().x; } }else { // 当前还是 A 产品,最低价格可以打半价 count += cur.x; while (!pq.isEmpty()) { cur = pq.poll(); count += cur.x; } if (cur.x % 2 == 0) { count -= cur.x / 2; } else { count -= cur.x / 2 + 0.5; } } System.out.format("%.2f", (float)count); } } class point{ int x; int y; public point(int x, int y) { this.x = x; this.y = y; } }
5. n个数据, & 结果为0 就输出 1, 否则没有和该数 & 结果为 0 的就输出 -1, 超时了 18%
import java.util.Arrays; import java.util.Scanner; /** * @author chenhong * @data 4/23/20 6:47 PM */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] arr = new int[n]; sc.nextLine(); for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } int[] res = new int[n]; Arrays.fill(res, -1); for (int i = 0; i < n; i++) { if (res[i] == 1) { continue; } for (int j = i + 1; j < n; j++) { if (res[j] == 1) { continue; } if ((arr[i] & arr[j]) == 0) { res[i] = 1; res[j] = 1; break; } } } for (int i = 0; i < n; i++) { System.out.print(res[i] + " "); } } }