【LeetCode】第283场周赛题解

本场题题目不难,但是力求写出精简优雅的代码,还是有需要学习的地方的。

第一题

力扣

 

class Solution:def cellsInRange(self, s: str) -> List[str]:ans = []a,b,c,d = s[0],s[1],s[3],s[4]for i in range(ord(a), ord(c)+1):for j in range(int(b),int(d)+1):ans.append(chr(i)+str(j))return ans

第二题:

力扣

AC代码:

class Solution {
public:long long calc(long long l, long long r) {if(l>r) return 0;return (l+r)*(r-l+1)/2;}long long minimalKSum(vector<int>& nums, int k) {sort(nums.begin(), nums.end());long long ans = 0;if(nums[0] - 1 >= k) {return calc(1, k);} else {ans += calc(1, nums[0]-1);k -= nums[0]-1;}for(int i = 1; i<nums.size(); i++) {if(nums[i] - nums[i-1] <=1) continue;if(nums[i] - nums[i-1] - 1 <= k) {k -= nums[i] - nums[i-1] - 1;ans += calc(nums[i-1]+1, nums[i]-1);} else {ans += calc(nums[i-1]+1, nums[i-1]+1+k-1);k = 0;break;}}if(k>0) {ans += calc(nums[nums.size()-1]+1, nums[nums.size()-1]+k);}return ans;}
};

AC代码2:(哨兵是个好东西)

class Solution {
public:long long calc(long long l, long long r) {if(l>r) return 0;return (l+r)*(r-l+1)/2;}long long minimalKSum(vector<int>& nums, int k) {nums.push_back(0);nums.push_back(int(1e9) + 5000000);sort(nums.begin(), nums.end());long long ans = 0;for(int i = 1; i<nums.size(); i++) {if(nums[i] - nums[i-1] <=1) continue;if(nums[i] - nums[i-1] - 1 <= k) {k -= nums[i] - nums[i-1] - 1;ans += calc(nums[i-1]+1, nums[i]-1);} else {ans += calc(nums[i-1]+1, nums[i-1]+1+k-1);k = 0;break;}}return ans;}
};

AC代码3:

只需要一次等差数列求和公式。先假设取1~K,其他时候遍历数组往后加就可以了。

第三题

力扣

解题报告:

我写的真的是垃圾代码, 首先最后一个for循环完全可以合并到第一个里面的。因为他是指针啊,只要new出来了,就算left和right是null也没关系的,直接修改就行。

并且,这题用python写是真的爽,dict能代替这里的一切。抽空改写成py。

而且其实这里用set也不是最优的,再加个vis数组不好吗?非要带个log。

不过我刚开始想的是直接把fa给改成map的,但是也不太容易写精简了,因为你要找出现过但没作为子节点出现的 那个节点。

AC代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int fa[100005];TreeNode* tr[100005];TreeNode* createBinaryTree(vector<vector<int>>& descriptions) {set<int> ss;for(int i = 0; i<descriptions.size(); i++) {int f = descriptions[i][0];int s = descriptions[i][1];fa[s] = f;ss.insert(s);ss.insert(f);if(tr[s] == nullptr) tr[s] = new TreeNode(s);if(tr[f] == nullptr) tr[f] = new TreeNode(f); }int root;for(auto x : ss) {if(fa[x] == 0) {root = x;break;}}for(int i = 0; i<descriptions.size(); i++) {int f = descriptions[i][0];int s = descriptions[i][1];if(descriptions[i][2] == 1) tr[f]->left = tr[s];else tr[f]->right = tr[s];}        return tr[root];}
};

第四题

力扣

 

 解题报告:

刚开始没看题,没看到要找相邻的两个“非互质数”。想了半天也凑出来了这个“升级版”题目的解法,一会说。

但是这题要是相邻的话,其实就简化很多了。

相邻的问题可以考虑栈做就行了。(就跟括号匹配之类的一样)

AC代码:

class Solution {
public:long long gcd(long long  a, long long b) {return b==0?a:gcd(b,a%b);}long long lcm(long long a, long long b) {return a*b/gcd(a,b);}vector<int> replaceNonCoprimes(vector<int>& nums) {stack<int> sk;sk.push(nums[0]);for(int i = 1; i<nums.size(); i++) {sk.push(nums[i]);int t1 = sk.top();sk.pop();int t2 = sk.top();sk.pop();int flag = 0;while(gcd(t1, t2) != 1) {sk.push(lcm(t1, t2));if(sk.size() <= 1) {flag = 1;break;}t1 = sk.top();sk.pop();t2 = sk.top();sk.pop();}if(flag == 0) {sk.push(t2);sk.push(t1);}}vector<int> ans;while(sk.size()) {int x = sk.top();ans.push_back(x);sk.pop();}reverse(ans.begin(), ans.end());return ans;}
};

这题1WA了因为sk.size()<=1的时候break了但是忘把取出来的元素再push进去了。

然后2WA是这么写的:其实是只改了再外面pop的情况。应该再想想,还有没有类似的情况会导致pop后忘记push。这样就会发现while里面也有。。然后就可以一次性改对了。

//2WA的部分代码for(int i = 1; i<nums.size(); i++) {sk.push(nums[i]);int t1 = sk.top();sk.pop();int t2 = sk.top();sk.pop();if(gcd(t1, t2) != 1) {while(gcd(t1, t2) != 1) {sk.push(int(lcm(t1, t2)));if(sk.size() <= 1) {break;}t1 = sk.top();sk.pop();t2 = sk.top();sk.pop();}} else {sk.push(t2);sk.push(t1);}}

这题也写丑了。对于stack的问题其实完全可以用vector去写的,这样一来最后不用出栈再reverse一遍,二来不用再繁琐的每次sk.top()sk.pop(),直接取v[v.size()-1]和v[v.size()-2]就行了,这样也不用if flag==0 再push进去了,真是太丑了。看看人家怎么写的。

class Solution {
public:int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }vector<int> replaceNonCoprimes(vector<int>& nums) {int n = nums.size();vector<int> ans;for (int i = 0; i < n; ++i) {int t = nums[i];while (!ans.empty() && gcd(t, ans.back()) > 1) {t = t / gcd(t, ans.back()) * ans.back();ans.pop_back();}ans.push_back(t);}return ans;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linq to Sql : 三种事务处理方式

Linq to SQL支持三种事务处理模型&#xff1a;显式本地事务、显式可分发事务、隐式事务。(from MSDN: 事务 (LINQ to SQL))。MSDN中描述得相对比较粗狂&#xff0c;下面就结合实例来对此进行阐述。 0. 测试环境 OSWindows Server 2008 Enterprise sp1IDEVisual Studio 2008, …

【LeetCode - 33】搜索旋转排序数组(二分)

力扣 解题报告&#xff1a; 二分。但是有不少细节要考虑清楚。 所以干脆考虑另一种二分的方式。也就是第二次二分的时候&#xff0c;把两半数组给拼成一个完整的数组&#xff0c;当然下标需要是虚拟的&#xff0c;这一步可以用偏移量取模完成。这样就不需要考虑边界情况了。 …

【LeetCode - 1765】. 地图中的最高点

力扣 解题报告&#xff1a; 多元BFS。 进阶一下&#xff1a; 二维数组&#xff0c;1表示等高线&#xff0c;0表示平地&#xff0c;比如 输入 010 111 010 输出 010 121 010输入 010 101 010 输出 010 111 010即输入一个二维地图&#xff0c;保证等高线一定是闭合的环&#x…

【转】微服务架构下分布式事务方案

1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务&#xff0c;这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇&#xff0c;很多互联网行业巨头、开源社区等都开始了微服务的讨论和实践。Hailo有160个不同服务构成…

【LeetCode - 443】压缩字符串(模拟)

解题报告&#xff1a; 直接模拟。 class Solution { public:int compress(vector<char>& chars) {int p 0;for(int i 0; i<chars.size();) {int j i1;while(j<chars.size() && chars[j] chars[i]) j;chars[p] chars[i];if(j-i > 1) {int cnt…

Linq to SQL之使用事务

事务是一个原子的工作单位&#xff0c;必须完整的完成单位里的所有工作&#xff0c;要么全部执行&#xff0c;要么全部都不执行。如果提交事务&#xff0c;则事务执行成功&#xff1b;如果回滚事务&#xff0c;则事务执行失败。 事务具备4个基本特性--ACID(原子性、一致性、孤立…

【LeetCode - 798】得分最高的最小轮调(转化法)

解题报告&#xff1a; 思路一&#xff1a;这题首先说一个nlogn的方法。 首先一个主客转化&#xff0c;题目描述是说把数组做翻转&#xff0c;idx不变&#xff0c;然后nums[i]和i作比较。那么我们可以转化为让数组不变&#xff0c;idx转变&#xff0c;即&#xff1a;假设刚开始…

【转】聊聊分布式事务,再说说解决方案

前言 最近很久没有写博客了&#xff0c;一方面是因为公司事情最近比较忙&#xff0c;另外一方面是因为在进行 CAP 的下一阶段的开发工作&#xff0c;不过目前已经告一段落了。 接下来还是开始我们今天的话题&#xff0c;说说分布式事务&#xff0c;或者说是我眼中的分布式事务…

【LeetCode - 2049】统计最高分的节点数目

解题报告&#xff1b; 直接dp。注意mx也得longlong AC代码&#xff1a; class Solution { public:vector<int> vv[200005];int sum[200005];long long ans[200005];int n;void dfs(int x) {ans[x] 1; sum[x] 1;for(int i 0; i<vv[x].size(); i) {dfs(vv[x][i]);s…

【LeetCode每日一题】2024. 考试的最大困扰度

​​​​​​力扣 解题报告&#xff1a; 因为只有T和F两个元素&#xff0c;不难证明单向性。尺取法解决。当然这题也可以二分。 AC代码&#xff1a; class Solution { public:int maxConsecutiveAnswers(string answerKey, int k) {int l 0, r 0;int T 0, F 0;int ans …

2022-08-20-网易笔试题

写在前面 题目收集来源自网络&#xff0c;前四题是开发岗的&#xff0c;后四题是算法岗的&#xff0c;因为代码无处提交&#xff0c;不一定正确&#xff0c;就不贴出来了&#xff0c;这里只写一下我的思路吧~欢迎大家一起讨论~~ 1、 思路&#xff1a;因为最大1e9&#xff0c…

TUN/TAP设备浅析(一) -- 原理浅析

TUN/TAP设备浅析 TUN设备 TUN 设备是一种虚拟网络设备&#xff0c;通过此设备&#xff0c;程序可以方便地模拟网络行为。TUN 模拟的是一个三层设备,也就是说,通过它可以处理来自网络层的数据&#xff0c;更通俗一点的说&#xff0c;通过它&#xff0c;我们可以处理 IP 数据包…

2022-08-21 星环科技-C++开发笔试

1、 思路&#xff1a;拓扑排序&#xff0c;不解释了 2、 思路&#xff1a; 本来以为他是一个图论问题&#xff0c;找最大环。 但其实对于这种情况&#xff0c;他是要输出0的&#xff0c;而不是9&#xff0c;所以他不是一个图论问题&#xff0c;他带有顺序性&#xff0c;这种可…

【算法练习题】位运算(贪心)

题目&#xff1a; 解题报告&#xff1a; 首先预备几个结论&#xff1a; 1、对于两个数a,b &#xff0c;生成a&b和a|b&#xff0c;则一定对应一个常数c&#xff0c;使得生成的两个数分别是ac和a-c。 2、对于两个数a,b&#xff0c;生成a&b和a|b的前后&#xff0c;二进…

TUN/TAP设备浅析(三) -- TUN/TAP设备的应用

上一篇文章主要讲述了TUN/TAP设备的一些原理&#xff0c;你可能会好奇&#xff0c;TUN/TAP设备究竟有什么用处呢&#xff1f;所以这篇文章&#xff0c;我想用一些实际的例子来回答这个问题。 例子源自陈硕老师的博客&#xff0c;博文中关于TUN/TAP设备的使用非常典型&#xff…

云计算底层技术-虚拟网络设备(Bridge,VLAN)

openstack底层技术-各种虚拟网络设备一(Bridge,VLAN) openstack底层技术-各种虚拟网络设备二(tun/tap,veth) Linux BridgeBridge与netfilterVLAN VLAN设备原理及配置VLAN在openstack中的应用IBM网站上有一篇高质量文章Linux 上的基础网络设备详解。本文会参考文章部分内容&…

【Codeforce-911D】逆序对

题干&#xff1a; Problem - D - Codeforces 解题报告&#xff1a; 不难发现&#xff0c;假设n的倒序排列(n,n-1,...,3,2,1)的逆序对是x&#xff0c;则对n的任意一个逆序对数为y的排列做翻转&#xff0c;新生成的排列的逆序对数位x-y。 因此这题作为奇偶性&#xff0c;其实只…

【LeetCode-面试题 17.09 - medium】第 k 个数

力扣 解题报告&#xff1a; 法一&#xff1a;优先队列做bfs。 法二&#xff1a;看成三个有序链表&#xff0c;做三路归并即可。 注意这里归并&#xff0c;如果多个指针最小值&#xff0c;那么这些指针都需要

10分钟精通SharePoint-验证方式

简介 说到身份验证大家应该不陌生&#xff0c;访问任何平台或系统都需要身份验证&#xff0c;SharePoint也不例外&#xff0c;用户身份验证可根据身份验证提供程序验证用户的身份&#xff0c;身份验证提供程序包含用户平局切可以确认用户正确提交这些平均的目录或数据库。用于…

【18周-钻石】能量供应

思路&#xff1a; 总纲是贪心&#xff0c;按终点排序&#xff0c;然后优先往右边排能量塔。具体实现的时候需要单点更新&#xff0c;区间查询&#xff0c;所以用树状数组set维护一下&#xff0c;就OK了。 代码&#xff1a;&#xff08;不知道为啥有一个样例RE了&#xff09; …