网易笔试 网易笔试题 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%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。