网易雷火笔试 网易雷火笔试题 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多种语言版本,持续更新中。