LeetCode 第382场周赛个人题解

2024-01-28 14:36

本文主要是介绍LeetCode 第382场周赛个人题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

100215. 按键变更的次数

原题链接

题目描述

接口描述

思路分析

AC代码

100195. Alice 和 Bob 玩鲜花游戏

原题链接

题目描述

接口描述

思路分析

AC代码

100206. 子集中元素的最大数量

原题链接

题目描述

接口描述

思路分析

AC代码

100179. 给定操作次数内使剩余元素的或值最小

原题链接

题目描述

接口描述

思路分析

AC代码


100215. 按键变更的次数

原题链接

100215. 按键变更的次数

题目描述

给你一个下标从 0 开始的字符串 s ,该字符串由用户输入。按键变更的定义是:使用与上次使用的按键不同的键。例如 s = "ab" 表示按键变更一次,而 s = "bBBb" 不存在按键变更。

返回用户输入过程中按键变更的次数。

注意:shift 或 caps lock 等修饰键不计入按键变更,也就是说,如果用户先输入字母 'a' 然后输入字母 'A' ,不算作按键变更。

接口描述

class Solution {
public:int countKeyChanges(string s) {}
};

思路分析

一次遍历,直接模拟即可

AC代码

class Solution {
public:int countKeyChanges(string s) {int ret = 0;char pre = s[0];for(auto x : s)ret += tolower(x) != tolower(pre) , pre = x;return ret;}
};

100195. Alice 和 Bob 玩鲜花游戏

原题链接

100195. Alice 和 Bob 玩鲜花游戏

题目描述

Alice 和 Bob 在一个长满鲜花的环形草地玩一个回合制游戏。环形的草地上有一些鲜花,Alice 到 Bob 之间顺时针有 x 朵鲜花,逆时针有 y 朵鲜花。

游戏过程如下:

  1. Alice 先行动。
  2. 每一次行动中,当前玩家必须选择顺时针或者逆时针,然后在这个方向上摘一朵鲜花。
  3. 一次行动结束后,如果所有鲜花都被摘完了,那么 当前 玩家抓住对手并赢得游戏的胜利。

给你两个整数 n 和 m ,你的任务是求出满足以下条件的所有 (x, y) 对:

  • 按照上述规则,Alice 必须赢得游戏。
  • Alice 顺时针方向上的鲜花数目 x 必须在区间 [1,n] 之间。
  • Alice 逆时针方向上的鲜花数目 y 必须在区间 [1,m] 之间。

请你返回满足题目描述的数对 (x, y) 的数目。

接口描述

 

class Solution {
public:long long flowerGame(int n, int m) {}
};

思路分析

 只有鲜花总数目为奇数时,Alice才能赢,(n / 2) * (m - m / 2) + (n - n / 2) * (m / 2)即为所有x * y为奇数的数对数目,没什么好说的

AC代码

class Solution {
public:long long flowerGame(long long n, long long m) {return (n / 2) * (m - m / 2) + (n - n / 2) * (m / 2);}
};

100206. 子集中元素的最大数量

原题链接

100206. 子集中元素的最大数量

题目描述

 

给你一个 正整数 数组 nums 。

你需要从数组中选出一个满足下述条件的

子集

  • 你可以将选中的元素放置在一个下标从 0 开始的数组中,并使其遵循以下模式:[x, x2, x4, ..., xk/2, xk, xk/2, ..., x4, x2, x]注意k 可以是任何 非负 的 2 的幂)。例如,[2, 4, 16, 4, 2] 和 [3, 9, 3] 都符合这一模式,而 [2, 4, 8, 4, 2] 则不符合。

返回满足这些条件的子集中,元素数量的 最大值 

接口描述

class Solution {
public:int maximumLength(vector<int>& nums) {}
};

思路分析

 把原数组从小到大排序,哈希表存每个数字出现次数,然后遍历排序后的数组,枚举每个数字作为开头的目标子集,不断平方直到哈希表中这个值出现次数小于2,该数字作为开头的子集数目即为平方次数乘2-1

也是模拟题

时间复杂度:O(nlogn)

AC代码

class Solution {
public:int maximumLength(vector<int>& nums) {unordered_map<long long,int> mp;for(auto x : nums) mp[x]++;sort(nums.begin() , nums.end());long long ret = max(1 , mp[1] & 1 ? mp[1] : mp[1] - 1);for(auto x : nums){if(x == 1) continue;long long y = x , s = 0;while(mp.count(y)){if(mp[y])s += 2;if(mp[y] < 2)break;y *= y;}ret = max(ret , s - 1);}return ret;}
};

100179. 给定操作次数内使剩余元素的或值最小

原题链接

100179. 给定操作次数内使剩余元素的或值最小

题目描述

 

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。

一次操作中,你可以选择 nums 中满足 0 <= i < nums.length - 1 的一个下标 i ,并将 nums[i] 和 nums[i + 1] 替换为数字 nums[i] & nums[i + 1] ,其中 & 表示按位 AND 操作。

请你返回 至多 k 次操作以内,使 nums 中所有剩余元素按位 OR 结果的 最小值 。

接口描述

 

class Solution {
public:int minOrAfterOperations(vector<int>& nums, int k) {}
};

思路分析

显然是一道考察位运算tip的题,尝试从位运算角度去思考

对于题目给的相与替换操作,可以使得最终相或的值相较于不操作原数组相或的值的某些二进制位由1变0

我们设原数组相或值为num,最优操作后相或值为ans,那么ans在二进制下为num的子集,因为我们的操作不能使得1的位增加,只能使得1的位减少

所以我们若干次操作后的或值最多只有log(num)种

那对于每一种我们如果能通过遍历一次数组就能确定其是否存在,时间复杂度就为O(nlogn),这题就能过了

所以有了思路,从高位枚举,设当前能被干掉的所有位为1组成的数字为ret,那么我们现在如果要判断第i位是否能被干掉,就相当于判断ret | (1 << i)是否能被干掉(因为为了最终的值尽可能小,我们优先干掉位高的)

类似于最长递增子数组的思想,我们一次遍历数组,只要当前的相与值和ret | (1 << i)相与为0,我们就计数加一,然后相与值再复位为二进制全1

最终我们就得到了相与值和ret | (1 << i)相与为0的子数组的最大数目,那么我们干掉ret | (1 << i)的操作次数就是len(nums)  - 子数组数目,维护我们能够干掉的数字位即可

最终返回没有被干掉的数字位组成的数字就是答案

时间复杂度O(nlogU)

AC代码

class Solution
{
public:int minOrAfterOperations(vector<int> &nums, int k){int ret = 0 , n = nums.size();for(int i = 29 ; i >= 0 ; i--){int cur = ret | (1 << i) , s = -1;int cnt = n;for(auto x : nums){s &= cur & x;if(!s) cnt-- , s = -1;}if(cnt <= k) ret = cur;}return (1 << 30) - 1 - ret;}
};

这篇关于LeetCode 第382场周赛个人题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/653914

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

分布式系统的个人理解小结

分布式系统:分的微小服务,以小而独立的业务为单位,形成子系统。 然后分布式系统中需要有统一的调用,形成大的聚合服务。 同时,微服务群,需要有交流(通讯,注册中心,同步,异步),有管理(监控,调度)。 对外服务,需要有控制的对外开发,安全网关。