高德一面凉(厦门)
①自我介绍
②介绍一下实习流程:
③研发是怎样保证自己的代码质量的(问单测,codereview之类的)
④介绍一下实习测试的项目
⑤假如一下子测试10000个数据,那么数据库的稳定性怎样保证的(分库分表,索引,cpu监控,实在不行就分布式,采用虚拟数据:excel等等代替真实数据的数据)
⑥代码题(没写好,面试官直接喷:写的这么烂我看不下去了)
题目要求 3 编写一个函数(语言不限,推荐Python/Java),判断两个JSON对象是否“逻辑相等”,需满足以下规则、 嵌套结构:支持任意层级的嵌套(如对象中的数组、数组中的对象等)。 5 数组顺序:若JSON中包含数组(Array),数组内元素顺序不影响比较结果(视为无序集合)。 6 例:[1,2,3]和[3,2,1]应被判定为相等。 7 数值近似:数值类型(如number)允许误差范围(如绝对误差≤1e-6)。 8 例:{"value": 3.1415926} 和 {"value": 3.1415927}视为相等。 9 日期时间:若字符串符合IS0 8601日期格式(如"2024-07-28T10:00:00Z”),不同时区的时间需转换后比 10 例:“2024-07-2810:00:00+08:00"(北京时间)和“2024-07-28T02:00:00Z(UTC)视为相等。 11 特殊键排除:所有以_开头的键(如"_meta")不参与比较。 下面是deepseek的标准答案:
import org.json.JSONArray; import org.json.JSONObject; import org.json.JSONException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashSet; import java.util.Set; public class JSONComparator { public static boolean areJSONObjectsEqual(Object obj1, Object obj2) throws JSONException, ParseException { if (obj1 instanceof JSONObject && obj2 instanceof JSONObject) { return compareJSONObjects((JSONObject) obj1, (JSONObject) obj2); } else if (obj1 instanceof JSONArray && obj2 instanceof JSONArray) { return compareJSONArrays((JSONArray) obj1, (JSONArray) obj2); } else if (obj1 instanceof Number && obj2 instanceof Number) { return compareNumbers((Number) obj1, (Number) obj2); } else if (obj1 instanceof String && obj2 instanceof String) { return compareStrings((String) obj1, (String) obj2); } else { return obj1.equals(obj2); } } private static boolean compareJSONObjects(JSONObject json1, JSONObject json2) throws JSONException, ParseException { if (json1.length() != json2.length()) { return false; } for (String key : json1.keySet()) { if (key.startsWith("_")) { continue; // 忽略以_开头的键 } if (!json2.has(key)) { return false; } Object value1 = json1.get(key); Object value2 = json2.get(key); if (!areJSONObjectsEqual(value1, value2)) { return false; } } return true; } private static boolean compareJSONArrays(JSONArray arr1, JSONArray arr2) throws JSONException, ParseException { if (arr1.length() != arr2.length()) { return false; } Set<Object> set1 = new HashSet<>(); Set<Object> set2 = new HashSet<>(); for (int i = 0; i < arr1.length(); i++) { set1.add(arr1.get(i)); } for (int i = 0; i < arr2.length(); i++) { set2.add(arr2.get(i)); } return set1.equals(set2); } private static boolean compareNumbers(Number num1, Number num2) { double d1 = num1.doubleValue(); double d2 = num2.doubleValue(); return Math.abs(d1 - d2) <= 1e-6; } private static boolean compareStrings(String str1, String str2) throws ParseException { if (isISODate(str1) && isISODate(str2)) { Date date1 = parseISODate(str1); Date date2 = parseISODate(str2); return date1.equals(date2); } else { return str1.equals(str2); } } private static boolean isISODate(String str) { try { parseISODate(str); return true; } catch (ParseException e) { return false; } } private static Date parseISODate(String str) throws ParseException { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); return format.parse(str); } public static void main(String[] args) throws JSONException, ParseException { String jsonStr1 = "{\"data\": [3, 2, 1], \"config\": {\"threshold\": 0.0000001, \"_comment\": \"ignore me\"}, \"time\": \"2024-07-28T10:00:00+08:00\"}"; String jsonStr2 = "{\"data\": [1, 2, 3], \"config\": {\"threshold\": 0.0000001}, \"time\": \"2024-07-28T02:00:00Z\"}"; JSONObject json1 = new JSONObject(jsonStr1); JSONObject json2 = new JSONObject(jsonStr2); System.out.println(areJSONObjectsEqual(json1, json2)); // 输出 true } }