复试 || 就业day10(2024.01.05)算法篇

文章目录

  • 前言
  • 等价多米诺骨牌对的数量
  • 拼写单词
  • “气球” 的最大数量
  • 独一无二的出现次数
  • 找出井字棋的获胜者
  • 种花问题
  • 用最少数量的箭引爆气球
  • 划分字母区间
  • 最小数字游戏

前言

💫你好,我是辰chen,本文旨在准备考研复试或就业
💫文章题目大多来自于 leetcode,当然也可能来自洛谷或其他刷题平台
💫欢迎大家的关注,我的博客主要关注于考研408以及AIoT的内容
🌟 仅给出C++版代码

以下的几个专栏是本人比较满意的专栏(大部分专栏仍在持续更新),欢迎大家的关注:

💥ACM-ICPC算法汇总【基础篇】
💥ACM-ICPC算法汇总【提高篇】
💥AIoT(人工智能+物联网)
💥考研
💥CSP认证考试历年题解

等价多米诺骨牌对的数量


题目链接:等价多米诺骨牌对的数量

C++版AC代码:

class Solution {
public:int numEquivDominoPairs(vector<vector<int>>& dominoes) {unordered_map<int, int> m;for (int i = 0; i < dominoes.size(); i ++ ) {int d = dominoes[i][0], u = dominoes[i][1];   if (d > u) swap(d, u);      // 不管是0°还是180°都统一映射成一个数m[d * 10 + u] ++;}int res = 0;for (auto i = m.begin(); i != m.end(); i ++ ) {int n = i -> second;res += (n - 1) * n / 2;    // 组合数学问题}return res;}
};

C++版AC代码:

关于组合数学那里其实可以再多一部思考: C n 2 = n ∗ ( n − 1 ) / 2 C_n^2 = n*(n-1)/2 Cn2=n(n1)/2 n ∗ ( n − 1 ) / 2 = 1 + 2 + . . . + n − 1 n*(n-1)/2 = 1+2+...+n-1 n(n1)/2=1+2+...+n1,因此可以边统计边计算

class Solution {
public:int numEquivDominoPairs(vector<vector<int>>& dominoes) {unordered_map<int, int> m;int res = 0;for (int i = 0; i < dominoes.size(); i ++ ) {int d = dominoes[i][0], u = dominoes[i][1];if (d > u) swap(d, u);int k = d * 10 + u;res += m[k], m[k] ++;    // 边统计边计算}return res;}
};

拼写单词


题目链接:拼写单词

C++版AC代码:

class Solution {
public:int countCharacters(vector<string>& words, string chars) {unordered_map<char, int> m;for (int i = 0; i < chars.size(); i ++ ) m[chars[i]] ++;int res = 0;for (int i = 0; i < words.size(); i ++ ) {string word = words[i];unordered_map<char, int> tmp;for (int j = 0; j < word.size(); j ++ ) tmp[word[j]] ++;bool flag = true;for (auto j = tmp.begin(); j != tmp.end(); j ++ ) {char c = j -> first;if (tmp[c] > m[c]) {flag = false;break;}}if (flag) res += word.size();}return res;}
};

“气球” 的最大数量


题目链接:“气球” 的最大数量

C++版AC代码:

主要学习一下多个值取 min 的语法:

return min({x1, x2, x3, x4, x5});
class Solution {
public:int maxNumberOfBalloons(string text) {unordered_map<char, int> m;for (int i = 0; i < text.size(); i ++ ) m[text[i]] ++;return min({m['b'], m['a'], m['l'] / 2, m['o'] / 2, m['n']});}
};

独一无二的出现次数


题目链接:独一无二的出现次数

C++版AC代码:

class Solution {
public:bool uniqueOccurrences(vector<int>& arr) {unordered_map<int, int> m1;       // 第一个映射,统计每个数出现的次数for (int i = 0; i < arr.size(); i ++ ) m1[arr[i]] ++;unordered_map<int, int> m2;       // 第二个映射,统计出现的次数的次数for (auto i = m1.begin(); i != m1.end(); i ++ ) {int cnt = i -> second;m2[cnt] ++;}bool flag = true;for (auto i = m2.begin(); i != m2.end(); i ++ ) if (i -> second != 1) {flag = false;break;}return flag;}
};

找出井字棋的获胜者


题目链接:找出井字棋的获胜者

C++版AC代码:

class Solution {
public:int a[3][3];string tictactoe(vector<vector<int>>& moves) {int win = 0;for (int i = 0; i < moves.size(); i ++ ) {int x = moves[i][0], y = moves[i][1];if ((i + 1) % 2) a[x][y] = 1;else a[x][y] = 2;}for (int i = 0; i < 3; i ++ ) {      // 横着或者竖着连成一直线if (a[i][0] == a[i][1] && a[i][1] == a[i][2]) {win = a[i][0];break;}else if (a[0][i] == a[1][i] && a[1][i] == a[2][i]) {win = a[0][i];break;}}if (a[0][0] == a[1][1] && a[1][1] == a[2][2]) win = a[0][0];  // 主对角线if (a[0][2] == a[1][1] && a[1][1] == a[2][0]) win = a[0][2];  // 副对角线if (win == 1) return "A";else if (win == 2) return "B";else if (win == 0 && moves.size() == 9) return "Draw";else return "Pending";}
};

种花问题


题目链接:种花问题

C++版AC代码:

class Solution {
public:bool canPlaceFlowers(vector<int>& flowerbed, int n) {int cnt = 0, m = flowerbed.size();if (m == 1 && !flowerbed[0]) return true;    // 特判只有一朵花if (m >= 2 && !flowerbed[0] && !flowerbed[1]) {  // 特判第一个结点flowerbed[0] = 1;cnt ++;}for (int i = 1; i < m - 1; i ++ ) if (!flowerbed[i] && !flowerbed[i - 1] && !flowerbed[i + 1]) { // 统计中间结点flowerbed[i] = 1;cnt ++;}if (m >= 2 && !flowerbed[m - 2] && !flowerbed[m - 1]) {  // 特判最后一个结点flowerbed[m - 1] = 1;cnt ++;}return cnt >= n;}
};

C++版AC代码:

改进:上述代码其实由于边界条件分成了三部分进行了处理,我们可以在 vector 的头和尾各添加一个 0,这样就可以规避边界处理

class Solution {
public:bool canPlaceFlowers(vector<int>& flowerbed, int n) {int cnt = 0, m = flowerbed.size();flowerbed.insert(flowerbed.begin(), 0);flowerbed.push_back(0);// 注意此时 flowered.size() == m + 2 ,flowerbed[m]才是未拓展前的最后一个元素for (int i = 1; i <= m; i ++ ) if (!flowerbed[i] && !flowerbed[i - 1] && !flowerbed[i + 1]) { // 统计中间结点flowerbed[i] = 1;cnt ++;}return cnt >= n;}
};

用最少数量的箭引爆气球


题目链接:用最少数量的箭引爆气球

C++版AC代码:

class Solution {
public:int min(int a, int b) {return a > b ? b : a;}/* 贪心:维护右端点,如果新加入的元素的左端点>当前维护的右端点,res ++;同时更新右端点为新加入元素的右端点如果新加入的元素的左端点≤当前维护的右端点,证明可以使用同一根箭引爆新气球则更新一下右端点的值为当前区间的右端点与新加入元素右端点的最小值*/int findMinArrowShots(vector<vector<int>>& points) {sort(points.begin(), points.end());   // 按照左端点进行排序int res = 0;long long ed = -1e10;  for (int i = 0; i < points.size(); i ++ ) {int l = points[i][0], r = points[i][1];if (l > ed) {res ++;ed = r;}else ed = min(ed, r);}return res;}
};

划分字母区间


题目链接:划分字母区间

C++版AC代码:

class Solution {
public:vector<int> partitionLabels(string s) {unordered_map<char, int> last;for (int i = 0; i < s.size(); i ++ ) last[s[i]] = i;  // 记录字母最后一次出现的位置vector<int> res;for (int i = 0; i < s.size(); i ++ ) {int r = i;           // 记录划分区间的最右边for (int j = i; j < s.size(); j ++ ) {r = max(r, last[s[j]]);   // 如果当前遍历的字母不是最后一个该字母,更新r为最大值if (j == r) {      // j 遍历到了划分点,即代表该段的字母不会出现在之后的段res.push_back(r - i + 1);i = j;break;}}}return res;}
};

最小数字游戏


题目链接:最小数字游戏

C++版AC代码:

class Solution {
public:vector<int> numberGame(vector<int>& nums) {sort(nums.begin(), nums.end());vector<int> res;for (int i = 0; i < nums.size(); i += 2 ) {int alice = nums[i], bob = nums[i + 1];res.push_back(bob), res.push_back(alice);}if (res.size() < nums.size()) res.push_back(nums[nums.size() - 1]);return res;}
};

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

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

相关文章

数据库:园林题库软件(《城市绿地设计规范》答题卷一 )

《城市绿地设计规范》答题卷一 填空题 1、城市绿地设计应贯彻人与自然和谐共存、可持续发展、经济合理等基本原则&#xff0c;创造良好生态和景观效果&#xff0c;促进人的身心健康。 2、城市绿地 urban green space 以植物为主要存在形态&#xff0c;用于改善城市生态&am…

YAML使用

yaml是类似xml&#xff0c;json的标记性语言&#xff0c;它强调以数据为中心 yaml的语法主要是如下几个&#xff1a; 大小写敏感 使用缩进表示层级关系 缩进不允许使用tab、只允许空格&#xff08;低版本限制&#xff0c;高版本不限制&#xff09; 缩进时空格数不重要&#xf…

【题解】—— LeetCode一周小结

1.经营摩天轮的最大利润 题目链接&#xff1a; 1599. 经营摩天轮的最大利润 你正在经营一座摩天轮&#xff0c;该摩天轮共有 4 个座舱 &#xff0c;每个座舱 最多可以容纳 4 位游客 。你可以 逆时针 轮转座舱&#xff0c;但每次轮转都需要支付一定的运行成本 runningCost 。摩…

Qt 多进程编程-将子程序嵌入到主窗口

关键字&#xff1a;GPT4、QProcess、FindWindowEx、Qt 、嵌入 文章目录 前言调用外部程序关于 QProcess 嵌入到主程序显示FindWindowEx & FindWindowFindWindowFindWindowEx使用场景 结束 前言 今天计划是稍微研究一下Qt的多进程编程&#xff0c;因为最近的程序感觉有点慢…

Docker简介、基本概念和安装

Docker简介、基本概念和安装 1.docker简介 1.1 什么是docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes (opens new window)在法国期间发起的一个公司内部项目&#xff0c;它是基于 dotCloud 公司多年云服务技术的一次革新&#xff0c;并于 2013 年 3 月以 Apache 2…

Objective-C中使用STL标准库Queue队列

1.修改.m文件为mm 2.导入queue头 #include<queue> 3.使用&#xff1a; #import <Foundation/Foundation.h> #include <cmath> #include <queue> using namespace std;int main(int argc, const char * argv[]) {autoreleasepool {NSLog("C标准…

云计算任务调度仿真01

云计算任务调度的研究大多数以来仿真研究&#xff0c;现梳理一些做过的代码研究 结果无数次的排错&#xff0c;终于finish with code 0 了 这个代码以来的是比较老的TensorFlow版本&#xff0c;我们都知道TensorFlow1.x和TensorFlow2.x之间有很大差别&#xff0c;但其实&#…

AspectJ 基础

前两篇AspectJ入门的文章大致的介绍了AspectJ,本文更完整、更详细的介绍AspectJ的基础知识。包括了切点、连接点、类型间声明及thisJoinPoint的基础知识&#xff0c;来更好的理解AspectJ的语法。 1 切点和连接点 挑选切点的时候&#xff0c;我们还可以通过方法的访问权限、是…

C++ 字符串哈希 || 字符串前缀哈希法

字符串Hash就是构造一个数字使之唯一代表一个字符串。但是为了将映射关系进行一一对应&#xff0c;也就是&#xff0c;一个字符串对应一个数字&#xff0c;那么一个数字也对应一个字符串。 用字符串Hash的目的是&#xff0c;我们如果要比较一个字符串&#xff0c;我们不用直接比…

Realm Management Extension领域管理扩展之安全状态

RME基于Arm TrustZone技术。TrustZone技术在Armv6中引入,提供以下两个安全状态: 安全状态(Secure state)非安全状态(Non-secure state)以下图表显示了在AArch64中的这两个安全状态以及通常在每个安全状态中找到的软件组件: 该架构将在安全状态运行的软件与在非安全状态运…

openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败

文章目录 openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败190.1 服务启动失败190.1.1 问题现象190.1.2 原因分析190.1.3 处理办法 openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败 190.1 服务启动失败 190.1.1 问题现…

【Leetcode】251.展开二维向量

一、题目 1、题目描述 请设计并实现一个能够展开二维向量的迭代器。该迭代器需要支持 next 和 hasNext 两种操作。 示例: Vector2D iterator = new Vector2D([[1, 2], [3], [4]]);iterator.next(); //返回1 iterator.next(); //返回2 iterator.next(); //返回3 iterator.h…

Copilot 插件的使用介绍:如何快速上手

GitHub Copilot 本文主要介绍如何通过脚本工具激活 GitHub Copilot 插件&#xff0c;提供安装及激活图文教程&#xff0c;大家按下面操作即可激活GitHub Copilot插件&#xff0c;免费使用Ai编码工具 一、GitHub Copilot 介绍 GitHub Copilot 是由 GitHub 和 OpenAI 共同开发的…

告别冗余空白,批量删除空白行

你是否遇到过这样的尴尬情况&#xff1a;花费了大量时间整理的文档&#xff0c;却在最后发现其中充斥着无用的空白行&#xff0c;这些多余的空行不仅影响美观&#xff0c;还让整个文档显得杂乱无章。今天&#xff0c;我要给大家介绍一款强大且实用的工具——首助编辑高手&#…

移动端对大批量图片加载的优化方法(三)

移动端对大批量图片加载的优化方法&#xff08;三&#xff09;Flutter 本篇主要从Flutter开发中可以使用到的对大批量图片加载的优化方法进行整理。 1.合适的图片格式 详情请参考移动端对大批量图片加载的优化方法&#xff08;一&#xff09;。 2.缓存机制 在Flutter中&am…

浅谈对Promise的理解。

一、Promise定义 JS中用于处理异步操作的编程模式。一个Promise是一个代理&#xff0c;它代表一个创建Promise时不一定已知的值。它允许我们将处理的程序与异步操作的最终成功值或失败值原因想关联起来。这使得异步方法可以像同步方法一样返回值&#xff1a;异步方法不会立即返…

uniapp最简单的底部兼容安全区域显示

效果图&#xff1a; 1.html写上动态padding-bottom <view class"button-wrap" :style"padding-bottom:bottomPaddingrpx"><view class"com-btn cencel-btn">取消</view><view class"com-btn confirm-btn " cl…

神经网络中的梯度爆炸

梯度爆炸是深度学习中的一种常见问题&#xff0c;指的是在反向传播过程中&#xff0c;某些梯度的值变得非常大&#xff0c;导致数值溢出或趋近于无穷大。梯度爆炸通常会导致训练不稳定&#xff0c;模型无法收敛&#xff0c;或者产生不可靠的结果。 梯度爆炸可能发生在深度神经…

【PostgreSQL创建索引的锁分析和使用注意】

1.1 创建普通B-tree索引的整体流程 如下是梳理的创建普通B-tree索引的大概流程&#xff0c;可供参考。 1.校验新索引的Catalog元数据|语法解析 ---将创建索引的sql解析成IndexStmt结构&#xff5c;校验B-Tree的handler -----校验内核是否支持该类型的索引,在pg_am中查找&q…