秋招突击——算法打卡——5/27——复习{寻找特定中位数}——新做:{最长回文字串、Z 字形变换}

文章目录

    • 复习——寻找特定中位数
    • 新作——最长回文子串
        • 个人思路分析
        • 实现代码
        • 参考学习
          • 和上述思路相同,枚举中心点
          • 字符串哈希+二分
    • 新作——Z 字形变换
        • 个人做法
          • 思路分析
          • 实现代码
        • 参考解法
        • 分析总结

复习——寻找特定中位数

  • 第一次的链接:寻找中位数
  • 本来以为已经会做了,第二遍写还是遇到了很多问题,没写出来,有很多参数不是很懂。重新做了一遍,在重新思考,现在懂了。
    • k是寻找第几个数字,加上初始坐标应该是 i+k-1
    • 当nums1.size() == i,表示对于nums1找个数组而言,已经遍历到头了,所以直接返回nums2即可
    • 当k=1,两个数组都没有遍历完,表示在两个有序数组中寻找第一小的数字,不就是比较一下头部吗?
   double findMedianSortedArray(vector<int> nums1,vector<int> nums2){int tot = nums1.size() + nums2.size();if(tot % 2 == 0){int left = find(nums1,0,nums2,0,tot / 2 );int right =  find(nums1,0,nums2,0,tot / 2 + 1);return (left + right) / 2.0;}else{return find(nums1,0,nums2,0,tot / 2 + 1);}}int find(vector<int> nums1,int i,vector<int> nums2,int j,int k){// 保证第一个数组短,第二个数组长if((nums1.size() - i) > (nums2.size() - j)) return find(nums2,j,nums1,i,k);// 找第一小的元素,有两个有序列表,就是选择开头元素最小的那个元素即可// 第一个列表已经遍历完毕了,然后就剩下第二个列表,也是求第一个元素,所以就直接返回if (k == 1){if(nums1.size() == i) return nums2[j];else return min(nums1[i],nums2[j]);}// 如果短的数组已经遍历到了最后一个元素,那么剩下的就是在长的数组里面找最终的那个元素,if (nums1.size() == i) return nums2[j + k - 1];// 更新转换之后的坐标int si = min((int)nums1.size(),i + k / 2),sj = j + k - k / 2;if(nums1[si - 1] > nums2[sj - 1]){return find(nums1,i,nums2,sj,k - (j - sj));}else{return find(nums1,si,nums2,j,k - (i - si));}}

新作——最长回文子串

  • 嘿嘿,头一次,中等题没做过,二十分分钟写出来,调整出来了。
    在这里插入图片描述
个人思路分析
  • 双指针,但是有两种模式:
    • 针对奇数个字符的回文字符串
    • 针对偶数个字符的回文字符串
  • 还有一个特征
    • 长的回文字符串是由短的回文字符串,所以如果不行,就不会存在更长的回文,直接跳转到下一个即可
实现代码
string longestPalindrome(string s) {int mid = 0,l,r;int res = 0,lRes = 0,RRes = 0;for(;mid < s.size();mid ++){// 奇数的模式l = mid,r= mid;while(l >= 0 && r < s.size()){if(s[l] == s[r]) {if(res <= r- l){lRes = l;RRes = r;res = r - l;}l --;r ++;}elsebreak;}// 偶数模式l = mid,r = mid + 1;while(l >= 0 && r < s.size()){if (s[l] == s[r]){if(res < r- l){lRes = l;RRes = r;res = r - l;}l --;r ++;}elsebreak;}}return s.substr(lRes,RRes - lRes);}
参考学习
和上述思路相同,枚举中心点
  • 这里代码写的真简洁,可以好好学习一下
string longestPalindrome(string s) {string res;for (int i = 0; i < s.size(); ++i) {int l = i - 1,r = i + 1;while(l >= 0 && r < s.size() && s[l] == s[r])  l --,r ++;if(res.size() < r - l -1) res = s.substr(l + 1,r - l -1);l = i,r = i + 1;while(l >= 0 && r < s.size() && s[l] == s[r])  l --,r ++;if(res.size() < r - l -1) res = s.substr(l + 1,r - l -1);}return res;}
字符串哈希+二分
  • 时间不够了,这里贴一下人家的代码和思路吧,还有论文要写,不能花太多时间。
    在这里插入图片描述
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
typedef unsigned long long ULL;
const int N = 2e6 + 10 , base = 131;
ULL hr[N] , hl[N] , p[N];
char str[N];
ULL get(ULL h[] , int l , int r)
{return h[r] - h[l - 1] * p[r + 1 - l];
}
int main()
{int T = 1;while(cin >> str + 1 , strcmp(str + 1 , "END")){int n = strlen(str + 1), res = 0;for(int i = 2 * n ; i >= 0 ; i -= 2){str[i] = str[i / 2];str[i - 1] = 'z' + 1;}n *= 2; p[0] = 1;for(int i = 1 , j = n; i <= n ; i ++ , j -- ){p[i] = p[i - 1] * base;hl[i] = hl[i - 1] * base + str[i];hr[i] = hr[i - 1] * base + str[j];}for(int i = 1 ; i <= n ; i ++ ){int l = 0 , r = min(n - i , i - 1);while(l < r){int mid = l + r + 1 >> 1;if(get(hl, i - mid, i - 1) == get(hr, n + 1 - (i + mid), n + 1 - (i + 1)))l = mid;else r = mid - 1;}if(str[i - l] <= 'z')res = max(res , l + 1);else res = max(res , l);}printf("Case %d: %d\n",T ++ , res);}return 0;
}

作者:tom233
链接:https://www.acwing.com/solution/content/33154/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

新作——Z 字形变换

在这里插入图片描述

个人做法
思路分析
  • 绘制一个二维矩阵,然后找规律,按照规律放到二维矩阵里面,然后在输出对应的矩阵。
  • 注意点,以下有一些小细节可以帮助你提高代码的可读性
    • 矩阵的坐标从1开始到边界结束,不要从零开始计算
实现代码
string convert(string s, int numRows) {int row = numRows ,col = s.size() / (numRows * 2 -2) * (numRows - 1);if (s.size() % (numRows * 2 -2) != 0)col ++;char m[row][col];int sIdx = 0;string res;for (int i = 0; i < col; ++i) {for (int j = 0; j < row; ++j) {if (sIdx == s.size()) break;// 竖线模式,顺次往下填if (i == 0 || i % (numRows - 1) == 0){m[j][i] = s[sIdx];res += s[sIdx];sIdx ++;}// 斜线模式,一次往上,主要是判定斜线是都会有对应的元素else{int iR = i % (numRows - 1), jR = (row - j - 1 )% (numRows - 1);if (j != 0 && iR == jR){m[j][i] = s[sIdx];res += s[sIdx];sIdx ++;}elsem[j][i] = ' ';}}}for (int i = 0; i < row; ++i) {for (int j = 0; j < col; ++j) {if (m[i][j] != ' ')res += m[i][j];}}return res;
}
  • 这个代码还是有问题,因为是在原来的逻辑上缝缝补补,还有很多漏洞

综合上述观察到的问题,重新进行编程,代码如下

  • 虽然很不想承认,但是确实中间那个斜杠的关系表达式,写了半天,没有调整出来,太丢人了,后来补了一个if表达式,始终没有找到能够用一个式子表达的情况!
string convert(string s, int numRows) {if(numRows == 1 || s.size() == 1) return s;int row = numRows ,col = s.size() / (numRows * 2 -2) * (numRows - 1);if (s.size() % (numRows * 2 -2) != 0)col ++;char m[row + 1][col + 1];int sIdx = 0;string res;for (int i = 1; i <= col; ++i) {for (int j = 1; j <= row; ++j) {if (sIdx == s.size()) break;// 竖线模式,顺次往下填if ( i % (numRows - 1) == 1){m[j][i] = s[sIdx];sIdx ++;}// 斜线模式,一次往上,主要是判定斜线是都会有对应的元素else{int iR = i % (numRows - 1) , jR = row - j + 1;if (iR == 0) iR = (numRows - 1);if ( iR == jR){m[j][i] = s[sIdx];sIdx ++;}elsem[j][i] = ' ';}}}for (int i = 1; i <= row; ++i) {for (int j = 1; j <= col; ++j) {if (m[i][j] <= 'Z' && m[i][j] >= 'A')res += m[i][j];}}return res;
}

在这里插入图片描述

  • 还是有部分样例不通过,这里不好费时间了,花了差不多一个半小时,不值得,下次不能再这样了!!
参考解法
  • 直接从根本上找问题,我靠,没有创建数组,然后直接找输出的序列,因为这本来就是一个等差序列,具体如下
    • 这个思路真的简洁,我靠,直接从根本上考虑

在这里插入图片描述

在这里插入图片描述

分析总结
  • 矩阵建议不要从零开始,因为要单独处理j为零的情况,出错的概率太高了,不建议,还是从1开始吧

  • 要跳出题目去看,不能被限制住。

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

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

相关文章

Ai终点站,全系统商业闭环矩阵打造,帮电商、实体降70%成本,12款Ai联合深度实战

说白了&#xff0c;你之前5个人的团队&#xff0c;当团队人数不变的情况下&#xff0c;借助于ChatGPT和各种软件的结合&#xff0c;赋能电商直播带货&#xff0c;可以让之前一年销售额2.000万变成2.500万或者是3.000万&#xff0c;这就是这套课程的核心作用: 【1】系统课程从1…

深度神经网络——贝叶斯与朴素贝叶斯定理

概述 贝叶斯定理是概率论中一个非常重要的概念&#xff0c;它提供了一种在已知某些相关事件的概率时&#xff0c;计算另一个事件发生概率的方法。在你提供的内容中&#xff0c;贝叶斯定理被描述为一种“魔法”&#xff0c;因为它能够使计算机通过分析大量的数据来预测人们可能…

100个 Unity小游戏系列七 -Unity 抽奖游戏专题五 刮刮乐游戏

一、演示效果 二、知识点讲解 2.1 布局 void CreateItems(){var rewardLists LuckyManager.Instance.CalculateRewardId(rewardDatas, Random.Range(4, 5));reward_data_list reward_data_list ?? new List<RewardData>();reward_data_list.Clear();for (int i 0; …

图像处理中的维度元素复制技巧

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、维度元素复制的基本概念 三、如何实现维度元素复制 1. 方法介绍 2. 代码示…

Petalinux 制作ZYNQ镜像文件流程

1概述 在Zynq-7000 SoC中搭建运行Linux&#xff0c;嵌入式软件栈。 处理器系统引导是一个分两个阶段的过程。第一个阶段是一个内部 BootROM&#xff0c;它存储 stage-0 的引导代码。BootROM 在 CPU 0 上执行&#xff0c;CPU 1 执行等待事件&#xff08;WFE&#xff09;指令。…

openresty(Nginx) 隐藏 软包名称及版本号 升级版本

1 访问错误或者异常的URL 2 修改配置&#xff0c;重新编译&#xff0c;升级 #修改版本等 vim ./bundle/nginx-1.13.6/src/core/nginx.h #define nginx_version 1013006 #define NGINX_VERSION "1.13.6" #define NGINX_VER "openresty/&q…

Sentinel-2 哨兵二号数据介绍及下载

1 Sentinel-2简介 SENTINEL-2 is a European wide-swath, high-resolution, multi-spectral imaging mission. Sentinel-2 是高分辨率多光谱成像卫星&#xff0c;一颗卫星的重访周期为10天&#xff0c;两颗互补&#xff0c;重访周期为5天。分为2A和2B两颗卫星。2A于2015年6月…

可燃气体报警器检测周期:如何合理设定以满足安全需求?

可燃气体报警器作为工业安全和生产环境中不可或缺的安全防护设备&#xff0c;其准确性、稳定性和及时响应性对于防止火灾和爆炸事故具有重要意义。 因此&#xff0c;合理设定并严格执行可燃气体报警器的检测周期&#xff0c;是确保安全与可靠运行的核心环节。 一、检测周期的重…

使用阿里云OSS实现视频上传功能

目录 前言 视频上传 前言 阿里云对象存储服务&#xff08;OSS&#xff09;作为一种高可用、高扩展性的云端存储服务&#xff0c;为开发者提供了便捷、安全的对象存储解决方案。本文将介绍如何利用阿里云OSS实现视频上传功能。 视频上传 前期准备请看阿里云OSS文件上传和下载…

浙江大学数据结构MOOC-课后习题-第九讲-排序2 Insert or Merge

题目汇总 浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024 题目描述 测试点 思路分析 刚开始我打算想推出一个规律&#xff0c;来判断是否是归并排序&#xff0c;但实在太过于复杂&#xff0c;我很难去想出这样的规律…因此&#xff0c;参考了其他博主的思路——每做一次排…

【微服务】安装docker以及可视化界面

1.配置yum下载源为aliyun源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo2.下载docker不加版本号默认为最新版本 yum install -y docker-ce3.启动以及开机自启 #启动docker命令 systemctl start docker #设置开机自启命令…

计算机组成原理----原码,反码与补码

目录 1.原码的出现 2.反码的出现 3.补码的出现 4.关于补码 1.原码的出现 我们通常使用"","-"判断数字的正负,而在计算机中,则将二进制的首位当作标记符号,"0"表示正数,"1"表示负数,这样就解决了在计算机中表示数值正负的问题,唯一…

allure测试报告用例数和 pytest执行用例数不相同问题

我出现的奇怪问题: pytest执行了9条用例,但是测试报告确只显示3条用例 我将其中的一个代码删除后,发现allure测试报告又正常了 我觉得很奇怪这个代码只是删除了二维数组的第一列,我检查了半天都找不到问题,只有降低版本了。导致原因:allure-pytest版本使用的是最新版本,…

机器学习-3-特征工程的重要性及常用特征选择方法

参考特征重要性:理解机器学习模型预测中的关键因素 参考[数据分析]特征选择的方法 1 特征重要性 特征重要性帮助我们理解哪些特征或变量对模型预测的影响最大。 特征重要性是数据科学中一个至关重要的概念,尤其是在建立预测性任务的模型时。想象你正在尝试预测明天是否会下…

ubuntu中idea创建spark项目步骤

1.前置条件 ubuntu中已经安装idea,jdk,scala,spark 2.打开idea&#xff0c;新建&#xff0c;选择Maven项目 3.在IDEA中&#xff0c;File-Setting-Plugin&#xff0c;下载Scala插件 4.File-project structure&#xff0c;导入插件 4.1在全局库中&#xff0c;选择导入刚才的sca…

写论文时某一行的字间距突然增大,如何解决?

问题描述&#xff1a; 某一行的字间距突然变大&#xff0c;占满了一行&#xff0c;检查设置也没有异常。 如何解决 一、全选出现问题的段落 二、右键&#xff0c;然后点击段落 三、然后勾选允许西文在单词中间换行 四、正常了

心链4---搜索页面前后端业务实现以及分布式session的共享实现

心链 — 伙伴匹配系统 搜索详情页面 之前前端的代码写到了搜索页面可以挑选搜索标签&#xff0c;并没有去根据具体标签搜索用户。这里就开始实现。 新建SearchResultPage.vue&#xff0c;并添加相关路由。 在搜索页添加搜索按钮&#xff0c;和触发点击。搜索页选择标签&#x…

WEB安全:Content Security Policy (CSP) 详解

Content Security Policy (CSP) 是一种强大的网页安全机制,用于防止跨站脚本 (XSS) 和其他注入攻击。通过设置一系列的内容安全策略,CSP 可以限制网页可以加载的资源,从而保护用户数据和网站的安全性。 什么是 XSS 攻击? 跨站脚本攻击 (XSS) 是一种常见的安全漏洞,攻击者…

闲鱼电商运营高级课程,一部手机学会闲鱼开店赚钱

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89360471 更多资源下载&#xff1a;关注我。 课程内容&#xff1a; 10-9、怎么寻找优质的货源店铺.mp4 11-10、怎么去选择商品图片.mp4 12-11、商品图片的注意避免事项.mp4 13-12、怎么写标题.mp4 …

【Mybatis】映射文件中获取单个参数和多个参数的写法

xml的映射文件中获取接口方法中传来的参数是直接用#{}的方式来获取的 那么接下来&#xff0c;我们就具体来说一下获取参数里边的各种规则和用法 1.单个参数&#xff0c;比如上面的getOneUser&#xff0c;只有一个id值作为参数 Mybatis对于只有一个参数的情况下&#xff0c;不…