网易雷火笔试 网易雷火笔试题 0911
笔试时间:2024年09月11日 秋招
历史笔试传送门:2023秋招笔试合集
第一题
题目
游戏玩法相关的数值数据一股来说会披放在一个叫配置表的地方。配置表样表如下:1 today 2 is 3 good 4 day。约定:第一列为主键列(id列,唯一,从上到下保持升序)第二列为值列,所谓的差异比对就是比对的新旧两张表相同id行的值游戏的每一个版本更新,策划都会对配置表中的数据进行修改以通应游戏玩法的变化,为了避免乘划因人为失误导致配置表错误修改,需要对配置表每次变更内容都做审核,基于这个场景,请设计一个新旧配置表差异比对的程序,将左表(旧表)和右表(新表)进行差异比对,返回两张表的新增修改/删除行的信息。这个程序包含了4个入参,分别对应左表(旧日表)和右表(新表)的主键列和值列,第1个参数是左表的主健列表,第2个参数是左表的值列表,第3个参数是右表的主健列表,第4个参数是右表的值列表。出参是个双层的列表,内部包含了3个列表,第1个列表是新增行id列表,第2个列表是修改行id列表,第3个列表是删除行id列表,这3个列表均按id开序排例列。
样例输入
[1,2],["nowcoder","best"],[1,2],["nowcoder","great"]
样例输出
[[],[2],[]]
说明:在这个样例中,无数据新增,所以返回值第一个列表为空,id=2的数据行被修改了,所以返回值第二个列表是[2],无数据删除,所以返回值第三个列表为空。
参考题解
使用两个哈希表分别存储左表和右表的主键和值的对应关系,方便快速查找和比较。遍历新表的主键列,找出新增和修改的行。遍历旧表的主键列,找出删除的行。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; vector<vector<long>> compareConfigs(vector<long> oldIds, vector<string> oldValues, vector<long> newIds, vector<string> newValues) { // 存储旧表和新表的数据 map<long, string> oldTable; map<long, string> newTable; vector<long> addedRows; vector<long> modifiedRows; vector<long> deletedRows; for (int i = 0; i < oldIds.size(); i++) { oldTable[oldIds[i]] = oldValues[i]; } for (int i = 0; i < newIds.size(); i++) { newTable[newIds[i]] = newValues[i]; } for (auto id : newIds) { if (oldTable.find(id) == oldTable.end()) { addedRows.push_back(id); } else if (newTable[id] != oldTable[id]) { modifiedRows.push_back(id); } } for (auto id : oldIds) { if (newTable.find(id) == newTable.end()) { deletedRows.push_back(id); } } sort(addedRows.begin(), addedRows.end()); sort(modifiedRows.begin(), modifiedRows.end()); sort(deletedRows.begin(), deletedRows.end()); vector<vector<long>> result = {addedRows, modifiedRows, deletedRows}; return result; }
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.*; public static ArrayList<ArrayList<Long>> compareConfigs(ArrayList<Long> oldIds, ArrayList<String> oldValues,ArrayList<Long> newIds, ArrayList<String> newValues) { // 存储旧表和新表的数据 Map<Long, String> oldTable = new HashMap<>(); Map<Long, String> newTable = new HashMap<>(); ArrayList<Long> addedRows = new ArrayList<>(); ArrayList<Long> modifiedRows = new ArrayList<>(); ArrayList<Long> deletedRows = new ArrayList<>(); for (int i = 0; i < oldIds.size(); i++) { oldTable.put(oldIds.get(i), oldValues.get(i)); } for (int i = 0; i < newIds.size(); i++) { newTable.put(newIds.get(i), newValues.get(i)); } for (int id : newIds) { if (!oldTable.containsKey(id)) { addedRows.add(id); } else if (!newTable.get(id).equals(oldTable.get(id))) { modifiedRows.add(id); } } for (int id : oldIds) { if (!newTable.containsKey(id)) { deletedRows.add(id); } } Collections.sort(addedRows); Collections.sort(modifiedRows); Collections.sort(deletedRows); ArrayList<ArrayList<Integer>> result = new ArrayList<>(); result.add(addedRows); result.add(modifiedRows); result.add(deletedRows); return result; } }
Python:[此代码未进行大量数据的测试,仅供参考]
def compare_configs(old_ids, old_values, new_ids, new_values): # 存储旧表和新表的数据 old_table = dict(zip(old_ids, old_values)) new_table = dict(zip(new_ids, new_values)) added_rows = [] modified_rows = [] deleted_rows = [] for id in new_ids: if i
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。