网易笔试 网易笔试题 0928

笔试时间:2024年09月28日 秋招

历史笔试传送门:2023秋招笔试合集

第一题

题目

给一堆以空格分割的字符串,将这些字符串重新排列,在保证出现顺序的前提下字典序要尽可能的小。

输入描述

第一行输入一行以空格分割的字符串。

输出描述

输出去重后的字符串列表,在保证出现顺序的前提下字典序要尽可能的小。

样例输入

seo optimization seo tutorial seo tutorial

样例输出

optimization seo tutorial

解释:optimization出现在在seo的前面和后面,所以optimization在最终的答案中既可以出现在seo的前面,也可以在后面,而optimization的字典序要比seo小,所以optimization在前面是最优的方案。

参考题解

记录每个字符串出现的起始位置和结束位置,如果a没有出现在b之前,那么a在最终答案里一定不能出现在b的前面,如果a没有出现在b之后,那么a在最终答案里一定不能出现在b的后面。因此我们对字符串自定义排序,先根据位置进行排序,再根据字典序进行排序即可。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>

using namespace std;

int main() {
    string line;
    getline(cin, line);
    stringstream ss(line);
    vector<string> arr;
    unordered_map<string, int> first, last;
    string str;
    int index = 0;

    while (ss >> str) {
        arr.push_back(str);
        if (first.find(str) == first.end()) {
            first[str] = index;
        }
        last[str] = index;
        index++;
    }

    sort(arr.begin(), arr.end(), [&](const string& s1, const string& s2) {
        int compare = s1.compare(s2);
        if (compare < 0) {
            return first[s1] < last[s2];
        } else if (compare == 0) {
            return false;
        } else {
            return last[s1] > last[s2];
        }
    });

    unordered_set<string> set;
    for (const string& str : arr) {
        if (set.find(str) == set.end()) {
            cout << str << " ";
            set.insert(str);
        }
    }
    cout << endl;

    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        String[] arr = line.split(" ");
        Map<String, Integer> first = new HashMap<>();
        Map<String, Integer> last = new HashMap<>();
        for (int i = 0; i < arr.length; i++) {
            String str = arr[i];
            if (!first.containsKey(str)) {
                first.put(str, i);
            }
            last.put(str, i);
        }

        Arrays.sort(arr, (s1, s2) -> {
            Integer compare = s1.compareTo(s2);
            if (compare == -1) {
                if (first.get(s1) < last.get(s2)) {
                    return -1;
                }else {
                    return 1;
                }
            }else if (compare == 0) {
                return 0;
            }else {
                if (last.get(s1) > last.get(s2)) {
                    return 1;
                }else {
                    return -1;
                }
            }
        });

        Set<String> set = new HashSet<>();
        for (String str : arr) {
            if (!set.contains(str)) {
                System.out.print(str + " ");
                set.add(str);
            }
        }
        System.out.println();
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

# Python 3 code equivalent

def main():
    line = input().strip()
    arr = line.split()
    first = {}
    last = {}

    for i, str_ in enumerate(arr):
        if str_ not in first:
            first[str_] = i
        last[str_] = i

    arr.sort(key=lambda s1: (s1, first[s1] < last[s1]))

    seen = set()
    for str_ in arr:
        if str_ not in seen:
            print(str_, end=" ")
            seen.add(str_)
    print()

if __name__ == "__main__":
    main()

第二题

题目

给一个字符串x代表一个数字,x的长度小于等于一百万。求一个最小的y(可能超过long的表示范围且y必须大于等于0),使得x加上y是回文串。

输入描述

第一行输入x。

输出描述

输出最小的y,使得x+y是回文串。

样例输入一

96

样例输出一

3

样例输入二

3

样例输出二

0

参考题解

将字符串分为左半部和右半部,然后将left反转。如果这个时候left等于right,那么代表不需要加。直接输出0.如果left > right,那么左边不需要进位,直接取left-right即可。否则左边需要进位,然后再减。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s;
    cin >> s;
    int n = s.size();

    auto sub = [&](string a, string b) -> string {
        int m = a.size();
        string ans;
        for (int i = m - 1; i >= 0; i--) {
            int d1 = a[i] - '0';
            int d2 = b[i] - '0';
            if (d1 < d2) {
                d1 = d1 + 10;
                a[i - 1]--;
            }
            ans += (char)(d1 - d2 + '0');
        }
        reverse(ans.begin(), ans.end());
        return ans;
    };

    auto add = [&](string a) -> string {
        int progress = 1;
        int m = a.size();
        for (int i = m - 1; i >= 0; i--) {
            int digit = a[i] - '0';
            digit += progress;
            progress = digit / 10;
            digit %= 10;
            a[i] = (char)(digit + '0');
        }
        if (progress == 1) {
            a = "1" + a;
        }
        return a;
    };

    string left = s.substr(0, n / 2);
    string right = s.substr(n - n / 2);
    reverse(left.begin(), left.end());
    if (left == right) {
        cout << 0 << "\n";
        return 0;
    }

    if (left < right) {
        left = s.substr(0, (n + 1) / 2);
        left = add(left);
        string right = left.substr(0, n / 2);
        reverse(right.begin(), right.end());
        string after = left + right;
        string ans = sub(after, s);
        int idx = 0;
        while (idx < ans.size() && ans[idx] == '0') {
            idx++;
        }
        cout << ans.substr(idx) << "\n";
    }else {
        string ans = sub(left, right);
        int idx = 0;
        while (idx < ans.size() && ans[idx] == '0') {
            idx++;
        }
        cout << ans.substr(idx) << "\n";
    }
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        int n = s.length();

        // 减法函数
        String sub(String a, String b) {
            int m = a.length();
            StringBuilder ans = new StringBuilder();
            for (int i = m - 1; i >= 0; i--) {
                int d1 = a.charAt(i) - '0';
                int d2 = b.charAt(i) - '0';
                if (d1 < d2) {
                    d1 = d1 + 10;
                    a = a.substring(0, i - 1) + (char) (a.charAt(i - 1) - 1) + a.substring(i);
                }
                ans.append((char) (d1 - d2 + '0'));
            }
            return ans.reverse().toString();
        }

        // 加法函数
        String add(String a) {
            int progress = 1;
            int m = a.length();
            StringBuilder sb = new StringBuilder(a);
            for (int i = m - 1; i >= 0; i--) {
                int digit = sb.charAt(i) - '0';
                digit += progress;
                progress = digit / 10;
                digit %= 10;
                sb.setCharAt(i, (char) (digit + '0'));
            }
            if (progress == 1) {
                sb.insert(0, "1");
            }
            return sb.toString();
        }

        String left = s.substring(0, n / 2);
        String right = s.substring(n - n / 2);
        StringBuilder leftRev = new StringBuilder(left).reverse();
        if (leftRev.toString().equals(right)) {
            System.out.println(0);
            return;
        }

        if (leftRev.toString().compareTo(right) < 0) {
            left = s.substring(0, (n + 1) / 2);
            left = add(left);
            right = left.substring(0, n / 2);
            StringBuilder rightRev = new StringBuilder(right).reverse();
            String after = left + rightRev;
            String ans = sub(after, s);
            int idx = 0;
            while (idx < ans.length() && ans.charAt(idx) == '0') {
                idx++;
            }
            System.out.println(ans.substring(idx));
        } else {
            String ans = sub(left, right);
            int idx = 0;
            while (idx < ans.length() && ans.charAt(idx) == '0') {
                idx++;
            }
            System.out.println(ans.substring(idx));
        }
    }

    // 用于执行 sub 和 add 的 helper 方法
}

Python:[此代码未进行大量数据的测试,仅供参考]

def sub(a, b):
    m = len(a)
    ans = []
    for i in range(m - 1, -1, -1):
        d1 = ord(a[i]) - ord('0')
        d2 = ord(b[i]) - ord('0')
        if d1 < d2:
            d1 += 10
            a = a[:i - 1] + chr(ord(a[i - 1]) - 1) + a[i:]
        ans.append(chr(d1 - d2 + ord('0')))
    return ''.join(ans[::-1])

def add(a):
    progress = 1
    m = len(a)
    a = list(a)
    for i in range(m - 1, -1, -1):
        digit = ord(a[i]) - ord('0')
        digit += progress
        progress = digit // 10
        digit %= 10
        a[i] = chr(digit + ord('0'))
    if progress == 1:
        a.insert(0, '1')
    return ''.join(a)

if __name__ == "__main__":
    s = input().strip()
    n = len(s)

    left = s[:n // 2]
    right = s[n - n // 2:]
    if left[::-1] == right:
        print(0)
    elif left[::-1] < right:
        left = s[:(n + 1) // 2]
        left = add(left)
        right = left[:n // 2]
        after = left + right[::-1]
        ans = sub(after, s)
        idx = 0
        while idx < len(ans) and ans[idx] == '0':
            idx += 1
        print(ans[idx:])
    else:
        ans = sub(left, right)
        idx = 0
        while idx < len(ans) and ans[idx] == '0':
            idx += 1
        print(ans[idx:])

第三题

题目

给定一行文本,识别其是否符合数组格式(数组可嵌套)。例如,下列每行文本均符合数组格式:

[]

[v1,v2,v3]

[v1,v2,[],v3]

[v1,v2,[v3,v4],v5]

[v1,v2,[v3,[v4]],v5]

具体而言,数组格式要求包括:

·数组一定以左中括号"["开头、以右中括号"]"结尾。数组可包含任意数目的数组元素(可以为0个),元素之间以逗号","分隔

数组元素可以是文本,也可以是嵌套数组。其中,数组元素如果是文本,则包含至少一个字符,并且不包含特殊字符“[”、"]”;数组元素如果是嵌套数组,则嵌套数组也符合格式要求。

而对于不符合数组格式的文本,请你计算其“合法前缀"的长度,以便提示改正。"合法前缀"是指:截至这个前缀处都符合数组格式,即存在某一行文本

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

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

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

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务