网易雷火笔试 网易雷火笔试题 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%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

点赞 评论 收藏
分享
3 12 评论
分享
牛客网
牛客企业服务