完美世界8.24 C++笔试代码分享(弱鸡AC)
1.走瓷砖问题?直接确定中间的8个点坐标,然后用力扣62题的思路来做就可以。这个代码我做了一个镜像,其实从左下到右上,还是从左上到右下,结果都是一样的,因为中间的限制是对称性的,所以我实现的是从左上到右下的代码,这样更加符合直觉。
#include <bits/stdc++.h> using namespace std; class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 正方形广场边长是 2n+1 * @return int整型 */ int count(int n) { int len = 2*n+1; vector<vector<int>> dp(len, vector<int>(len, 0)); dp[0][0] = 1; set<pair<int,int>> midp = middle_points(len); for(int j = 1; j < len; j++) { if(midp.count({0,j})) break; dp[0][j] += dp[0][j-1]; } for(int i = 1; i < len; i++) { if(midp.count({i,0})) break; dp[i][0] += dp[i-1][0]; } for(int i = 1; i < len; i++) { for(int j = 1; j < len; j++) { if(midp.count({i,j})) continue; if(!midp.count({i-1,j})) dp[i][j] += dp[i-1][j]; if(!midp.count({i,j-1})) dp[i][j] += dp[i][j-1]; } } return dp[len-1][len-1]; } set<pair<int,int>> middle_points(int n) { set<pair<int,int>> res; pair<int,int> middle {n/2,n/2}; res.insert(middle); res.insert({middle.first-1,middle.second-1}); res.insert({middle.first-1,middle.second}); res.insert({middle.first-1,middle.second+1}); res.insert({middle.first,middle.second-1}); res.insert({middle.first,middle.second+1}); res.insert({middle.first+1,middle.second-1}); res.insert({middle.first+1,middle.second}); res.insert({middle.first+1,middle.second+1}); return res; } }; int main() { Solution s1; cout << s1.count(2) << endl; return 0; }2. 数组可以拼接的最大数字,力扣原题,做个排序就行
#include <bits/stdc++.h> using namespace std; class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @return string字符串 */ string largest(vector<int>& nums) { int len = nums.size(); if(len < 1) return "0"; vector<string> snums; for(auto& e : nums) { snums.push_back(to_string(e)); } sort(snums.begin(), snums.end(), compare); string res = ""; for(auto& str : snums) { res += str; } if(res[0] == '0') return "0"; return res; } static bool compare(string& s1, string& s2) { return s1+s2 > s2+s1; } }; int main() { Solution s1; vector<int> nums{1,20,21,4,8}; cout << s1.largest(nums) << endl; return 0; }