算法闭关修炼百题计划(八)

一半来自力扣的push题单

  • 1.最大连续1的个数II
  • 2.长度为k的无重复字符子串
  • 3.句子的相似性
  • 4.移位字符串分组
  • 5.x的平方根
  • 6.Z字形变换

1.最大连续1的个数II

给定一个二进制数组nums,如果最多可以翻转一个0,则返回数组中连续1的最大个数

之前是Window,其实这个更简单,因为只有0和1,所以求sum就可以直到01的分布了

class Solution {
public:int findMaxConsecutiveOnes(vector<int>& nums) {int left = 0, right = 0;int res = 0, sum = 0;while(right < nums.size()){sum += nums[right++];while(sum < right - left - 1){sum -= nums[left++];}res = max(res, right - left);}return res;}
};

2.长度为k的无重复字符子串

给你一个字符串 S,找出所有长度为 K 且不含重复字符的子串,请你返回全部满足要求的子串的 数目。

以window[c]>1为缩小窗口的条件,而不是长度大于k为缩小窗口的条件,因为如果以无重复为条件的话,当长度为k的时候,无重复的字符也自然为k,这样逻辑清晰简洁。
另外最后找到一个窗口之后必须移动left,不能启动先在while中移动right来被动推动left的移动,因为这样会存在不必要的风险。

class Solution {
public:int numKLenSubstrNoRepeats(string s, int k) {unordered_map<char, int> window;int left = 0, right = 0;int ans = 0;while(right < s.size()){char c = s[right++];window[c]++;while(window[c] > 1){char d = s[left++];window[d]--;}if(right - left == k){ans++;window[s[left++]]--;}}return ans;}
};

3.句子的相似性

输入:
sentence1 = [“great”,“acting”,“skills”],
sentence2 = [“fine”,“drama”,“talent”],
similarPairs = [[“great”,“fine”],[“drama”,“acting”],[“skills”,“talent”]]
输出: true
解释: 这两个句子长度相同,每个单词都相似。

用unordered_map<string, unordered_set< string >>来处理,因为相似的可能是很多个字符串

class Solution {
public:bool areSentencesSimilar(vector<string>& sentence1, vector<string>& sentence2, vector<vector<string>>& similarPairs) {if(sentence1 == sentence2) return true;if(sentence1.size() != sentence2.size()) return false;unordered_map<string, unordered_set<string>> similarityMap;for(auto & similar : similarPairs){similarityMap[similar[0]].insert(similar[1]);similarityMap[similar[1]].insert(similar[0]);}for(int i = 0; i < sentence1.size(); i ++){string word1 = sentence1[i];string word2 = sentence2[i];if(word1 != word2 && !similarityMap[word1].count(word2)) return false;}return true;}
};

4.移位字符串分组

在这里插入图片描述
示例 1:
输入:strings = [“abc”,“bcd”,“acef”,“xyz”,“az”,“ba”,“a”,“z”]
输出:[[“acef”],[“a”,“z”],[“abc”,“bcd”,“xyz”],[“az”,“ba”]]

示例 2:
输入:strings = [“a”]
输出:[[“a”]]

分析:
给定一个字符串数组 strings,需要将具有相同“移位序列”的字符串分组。所谓“移位序列”指的是,通过多次“左移”或“右移”操作可以变为相同的字符串。例如,“abc”可以通过连续的右移变为“bcd”、“cde”……,也可以通过左移变为“zab”等。因此,“abc”、“bcd”、“xyz”等字符串具有相同的“移位序列”。

解题思路:
我们可以通过将每个字符串移位的标准化(比如转换到以‘a’开头的形式)来表示“移位序列”。
将转换后的标准形式作为键,使用哈希表存储相同“移位序列”的字符串。

class Solution {
public:// Helper function to get the shifted version of a string to a common formstring shiftToA(const string& s) {int offset = s[0] - 'a';string shifted;for (char c : s) {char new_char = (c - offset + 26) % 26 + 'a'; // Circular shiftshifted += new_char;}return shifted;}vector<vector<string>> groupStrings(vector<string>& strings) {unordered_map<string, vector<string>> map;for (const string& s : strings) {string key = shiftToA(s); // Shift string to normalized formmap[key].push_back(s);}vector<vector<string>> result;for (auto& entry : map) {result.push_back(entry.second);}return result;}
};

5.x的平方根

给你一个非负整数x,计算并返回x的算术平方根
由于返回的类型是整数,结果只保留整数部分,小数部分会被舍去
注意:不允许使用任何内置指数函数和算符

思路
对于一个给定的非负整数 x,我们想找到一个整数 y,使得 y * y <= x 并且 (y + 1) * (y + 1) > x。这样 y 就是 x 的整数部分平方根。

二分查找方法
设置左右边界 left = 0 和 right = x。
每次取中点 mid = (left + right) / 2。
检查 mid * mid 与 x 的关系:
如果 mid * mid 等于 x,则 mid 就是平方根,直接返回。
如果 mid * mid 小于 x,说明平方根在 mid 的右边,所以将 left 更新为 mid + 1。
如果 mid * mid 大于 x,说明平方根在 mid 的左边,所以将 right 更新为 mid - 1。
当 left 超过 right 时,right 就是整数部分的平方根。

class Solution {
public:int mySqrt(int x) {if (x < 2) return x;  // 对于 x = 0 或 1,平方根就是 x 本身int left = 1, right = x / 2, result = 0;while (left <= right) {int mid = left + (right - left) / 2;if (mid <= x / mid) {  // 防止 mid * mid 溢出,用 x / mid 替代result = mid;  // 更新结果left = mid + 1;} else {right = mid - 1;}}return result;}
};

6.Z字形变换

在这里插入图片描述
题目写的很那理解,跟Z几乎没有关系,个人认为是一个无限延长的W,一个字符串s,如果给的行数是4,那么s中每一个字符的行就是1234321234321…

class Solution {
public:string convert(string s, int numRows) {if (numRows == 1) return s;  // 如果只有一行,直接返回vector<string> rows(min(numRows, int(s.size())));  // 创建一个有 numRows 行的 vectorint curRow = 0;  // 当前行bool goingDown = false;  // 方向标志for (char c : s) {rows[curRow] += c;  // 将字符添加到当前行// 若到达顶部或底部,反转方向if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;// 根据方向更新当前行// 如果goingDown是true,就返回1,否则返回-1curRow += goingDown ? 1 : -1;}// 拼接所有行的字符串string result;for (string row : rows) result += row;return result;}
};

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

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

相关文章

Python的Matplotlib

介绍&#xff1a; Matplotlib 是一个非常强大的 Python 绘图库&#xff0c;支持多种不同类型的图表。以下是 Matplotlib 支持的一些常见图表类型&#xff1a; 前情提要&#xff1a; from matplotlib import rcParams# 设置支持中文的字体 rcParams[font.sans-serif] [SimHei…

论文笔记(五十六)VIPose: Real-time Visual-Inertial 6D Object Pose Tracking

VIPose: Real-time Visual-Inertial 6D Object Pose Tracking 文章概括摘要I. INTRODACTIONII. 相关工作III. APPROACHA. 姿态跟踪工作流程B. VIPose网络 文章概括 引用&#xff1a; inproceedings{ge2021vipose,title{Vipose: Real-time visual-inertial 6d object pose tra…

K8S containerd拉取harbor镜像

前言 接前面的环境 K8S 1.24以后开始启用docker作为CRI&#xff0c;这里用containerd拉取 参考文档 正文 vim /etc/containerd/config.toml #修改内容如下 #sandbox_image "registry.aliyuncs.com/google_containers/pause:3.10" systemd_cgroup true [plugins.…

LM2 : A Simple Society of Language Models Solves Complex Reasoning

文章目录 题目摘要简介相关工作方法论实验结果结论局限性 题目 LM2&#xff1a;简单的语言模型社会解决复杂推理问题 论文地址&#xff1a;https://aclanthology.org/2024.emnlp-main.920/ 项目地址&#xff1a; https://github.com/LCS2-IIITD/Language_Model_Multiplex 摘要…

STM32从上电开始启动过程详解(上电->分散加载->main函数)

1.硬件复位之后&#xff0c;CPU 内的时序逻辑电路首先完成如下两个工作&#xff08; 程序代码下载到内部 flash 为例&#xff0c;flash首地址 0x0800 0000&#xff09;  将 0x08000000 位置存放的堆栈栈顶地址存放到 SP 中(MSP)。  将 0x08000004 位置存放的向量地址装入 P…

新版Apache tomcat服务安装 Mac+Window双环境(笔记)

简介&#xff1a;Tomcat服务器器的下载和安装&#xff1a; 安装前提 1&#xff09;电脑需要有java环境&#xff0c;jdk8以上&#xff0c;否则启动不不成功 2&#xff09;已经安装Sublime⽂文件编辑软件 3&#xff09;window电脑需要显示⽂文件拓拓展名 官网&#xff08;https:…

机器学习 决策树

决策树-分类 1 概念 1、决策节点通过条件判断而进行分支选择的节点。如&#xff1a;将某个样本中的属性值(特征值)与决策节点上的值进行比较&#xff0c;从而判断它的流向。 2、叶子节点没有子节点的节点&#xff0c;表示最终的决策结果。 3、决策树的深度所有节点的最大层…

数据重塑:长宽数据转换【基于tidyr】

在数据分析和可视化过程中&#xff0c;数据的组织形式直接影响着我们能够进行的分析类型和可视化效果。这里简单介绍两种常见的数据格式&#xff1a;长格式&#xff08;Long Format&#xff09;和宽格式&#xff08;Wide Format&#xff09;&#xff0c;以及如何使用tidyr包进行…

全面解读 USB Key:定义、使用场景、加密技术及 Java 实现

文章目录 **什么是 USB Key&#xff1f;****USB Key 的使用场景**1. **身份认证**2. **数字签名**3. **数据加密与解密**4. **证书管理** **USB Key 解决的问题****USB Key 使用的加密技术**1. **对称加密**2. **非对称加密**3. **哈希算法**4. **数字签名**5. **PKI&#xff0…

ollama+springboot ai+vue+elementUI整合

1. 下载安装ollama (1) 官网下载地址&#xff1a;https://github.com/ollama/ollama 这里以window版本为主&#xff0c;下载链接为&#xff1a;https://ollama.com/download/OllamaSetup.exe。 安装完毕后&#xff0c;桌面小图标有一个小图标&#xff0c;表示已安装成功&…

WPF 应用程序中使用 Prism 框架时,有多种方式可以注册服务和依赖项

Prism 提供了更多的注册方式&#xff0c;适应不同的需求和场景。下面我会全面列出 IContainerRegistry 提供的所有常见注册方式&#xff0c;并附带相应的示例。1. 注册单例&#xff08;Singleton&#xff09; 注册单例类型服务&#xff0c;整个应用生命周期内只会创建一个实例&…

基于lighthouse搭建私有网盘Cloudreve【开源应用实践】

基于lighthouse搭建私有网盘Cloudreve【超高性价比】 今天给大家分享一款私人网盘神器&#xff0c;既能存放你的文件文档&#xff0c;也能替你保存那不可告人的秘密~ 香菇今天将手把手教给大家如何在腾讯云轻量应用服务器上搭建个人专属网盘 1. 既爱又恨的网盘存储 很多小伙伴…

vue项目PC端和移动端实现在线预览docx、excel、pdf文件

可以参考vue-office官方github&#xff1a;​​​​​​​GitHub - loonghe/vue-office: 支持word(.docx)、excel(.xlsx,.xls)、pdf等各类型office文件预览的vue组件集合&#xff0c;提供一站式office文件预览方案&#xff0c;支持vue2和3&#xff0c;也支持React等非Vue框架。…

【CSS问题】margin塌陷

CSS中的margin塌陷是一个常见的布局问题&#xff0c;主要发生在垂直方向上&#xff0c;当两个或多个元素的垂直margin相遇时&#xff0c;它们不会按照预期叠加&#xff0c;而是会发生重叠&#xff0c;导致最终的外边距值比单独设置时小。 一、margin塌陷的原因 同级元素&#…

JavaScript高级篇 - 浏览器事件详解 DOM事件以及独立封装事件Util和Ajax封装

Dom事件 Model&#xff08;特定领域对象的抽象&#xff09;、Protocal&#xff08;针对数据格式的约定&#xff09; DOM(Document Object Model&#xff0c;文档对象模型)是针对HTML文档和XML文档的一个API。DOM描绘了一个层次化的节点树&#xff0c;允许开发人员添加、移出和…

MinIO 的 S3 over RDMA 计划: 为高速人工智能数据基础设施设定对象存储新标准

随着 AI 和机器学习的需求不断加速&#xff0c;数据中心网络正在迅速发展以跟上步伐。对于许多企业来说&#xff0c;400GbE 甚至 800GbE 正在成为标准选择&#xff0c;因为数据密集型和时间敏感型 AI 工作负载需要高速、低延迟的数据传输。用于大型语言处理、实时分析和计算机视…

git config是做什么的?

git config是做什么的&#xff1f; git config作用配置级别三种配置级别的介绍及使用&#xff0c;配置文件说明 使用说明git confi查看参数 默认/不使用这个参数 情况下 Git 使用哪个配置等级&#xff1f; 一些常见的行为查看配置信息设置配置信息删除配置信息 一些常用的配置信…

电能表预付费系统-标准传输规范(STS)(41)

7.3.7 TokenValidation Class 0 and Class 2 tokens shall primarily be validated against the TID encoded in the token, except for key change token set. 除密钥更改令牌集外&#xff0c;类别0和类别2令牌应主要针对令牌中编码的TID进行验证。 Key change tokens are va…

使用 npm 安装 Yarn

PS E:\WeChat Files\wxid_fipwhzebc1yh22\FileStorage\File\2024-11\spid-admin\spid-admin> yarn install yarn : 无法将“yarn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后…

51单片机使用NRF24L01进行2.4G无线通信

本文并不打算详细介绍NRF24L01的各个功能寄存器及指令的详细用法&#xff0c;因为网上都可以搜到很多非常详细的教程文档&#xff0c;这里只是介绍一些基本概念、用法以及代码的解释&#xff0c;旨在帮助新手能够快速上手调通快速使用。 基础概念 该模块使用的是SPI协议&…