4399笔试 4399笔试题 0812
笔试时间:2024年08月12日
历史笔试传送门:2023秋招笔试合集
第一题
题目
设计一个游戏角色的装备系统,系统可以包含合成装备以及独立装备,这里的合成装备,可以继续包含独立装备以及合成装备。战力系数是装备在系统里面的嵌套合成数,装备的战力系数越高,表示战力越高,请计算出整个系统里面装备的战力和。
提示:战力=装备力*嵌套合成数。
样例输入一
[1,[4,[6]]]
样例输出一
27
说明
解释:一个嵌套合成数为1,战力为1的装备,一个嵌套合成数为2,战力为4的装备,一个嵌套合成数为3,战力为6的装备。所以1+4*2+6*3=27。
样例输入二
[[1,1],2,[1,1]]
样例输出二
10
说明
因为装备中有四个嵌套合成数为2,战力为1的装备;和一个嵌套合成数为1,战力为2的装备。
参考题解
由于读入是字符串,从前往后遍历字符串,遇到"["深度加1,遇到"]"深度减1,遍历到数字往后找到数字的右边界,然后累加当前数字乘以深度到答案上。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> #include <queue> #include <vector> #include <algorithm> #include <cstring> using namespace std; int main() { string s; cin >> s; int left_cnt = 0; string cur_int = ""; int res = 0; for (int i = 0; i < s.length(); i++) { if (s[i] == '[') { left_cnt++; } else if (s[i] == ']') { if (cur_int == "") { left_cnt--; continue; } res += stoi(cur_int) * left_cnt; left_cnt--; cur_int = ""; } else if (s[i] == ',') { if (cur_int == "") { continue; } res += stoi(cur_int) * left_cnt; cur_int = ""; } else { cur_int += s[i]; } } cout << res; return 0; }
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String s = scanner.nextLine(); int leftCnt = 0; String curInt = ""; int res = 0; for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == '[') { leftCnt++; } else if (s.charAt(i) == ']') { if (curInt.equals("")) { leftCnt--; continue; } res += Integer.parseInt(curInt) * leftCnt; leftCnt--; curInt = ""; } else if (s.charAt(i) == ',') { if (curInt.equals("")) { continue; } res += Integer.parseInt(curInt) * leftCnt; curInt = ""; } else { curInt += s.charAt(i); } } System.out.println(res); scanner.close(); } }
Python:[此代码未进行大量数据的测试,仅供参考]
def main(): s = input() left_cnt = 0 cur_int = "" res = 0 for i in range(len(s)): if s[i] == '[': left_cnt += 1 elif s[i] == ']': if cur_int == "": left_cnt -= 1 continue res += int(cur_int) * left_cnt left_cnt -= 1 cur_int = "" elif s[i] == ',': if cur_int == "": continue res += int(cur_int) * left_cnt cur_int = "" else: cur_int += s[i] print(res) if __name__ == "__main__": main()
第二题
题目
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会白动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下,今晚能够偷窃到的最高金额。
请按照如下代码模板格式编写代码:
class Solution { public int rob(int[] nums) { } }
样例输入一
nums =[2, 3, 2]
样例输出一
3
解释:
你不能先偷窃1号房屋(金额=2),然后偷窃3号房屋(金额=2),因为他们是相邻的。
样例输入二
nums =[1, 2, 3, 1]
样例输出二
4
解释:
你可以先偷窃1号房屋(金额=1),然后偷窃3号房屋(金额= 3)偷窃到的最高金额为1+3=4。
参考题解
打家劫舍,leetcode原题。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <vector> #include <algorithm> using namespace std; class Solution { public: int rob(vector<int>& nums) { int length = nums.size(); if (length == 1) { return nums[0]; } else if (length == 2) { return max(nums[0], nums[1]); } return max(robRange(nums, 0, length - 2), robRange(nums, 1, length - 1)); } private: int robRange(vector<int>& nums, int start, int end) { int first = nums[start]; int second = max(nums[start], nums[start + 1]); for (int i = start + 2; i <= end; i++) { int temp = second; second = max(first + nums[i], second); first = temp; } return second; } };
Java:[此代码未进行大量数据的测试,仅供参考]
class Solution { public int rob(int[] nums) { int length = nums.length; if (length == 1) { return nums[0]; } else if (length == 2) { return Math.max(nums[0], nums[1]); } return Math.max(robRange(nums, 0, length - 2), robRange(nums, 1, length - 1)); } public int robRange(int[] nums, int start, int end) { int first = nums[start], second = Math.max(nums[start], nums[start + 1]); for (int i = start + 2; i <= end; i++) { int temp = second; second = Math.max(first + nums[i], second); first = temp; } return second; } }
Python:[此代码未进行大量数据的测试,仅供参考]
class Solution: def rob(self, nums: List[int]) -> int: length = len(nums) if length == 1: return nums[0] elif length == 2: return max(nums[0], nums[1]) return max(self.rob_range(nums, 0, length - 2), self.rob_range(nums, 1, length - 1)) def rob_range(self, nums: List[int], start: int, end: int) -> int: first = nums[start] second = max(nums[start], nums[start + 1]) for i in range(start + 2, end + 1): temp = second second =
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。