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

news2024/12/23 5:56:27

文章目录

    • 复习——寻找特定中位数
    • 新作——最长回文子串
        • 个人思路分析
        • 实现代码
        • 参考学习
          • 和上述思路相同,枚举中心点
          • 字符串哈希+二分
    • 新作——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 ++;
                }else
                    break;
            }

            // 偶数模式
            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 ++;
                }else
                    break;
            }
        }
        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 ++;
                }
                else
                    m[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 ++;
                }
                else
                    m[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.coloradmin.cn/o/1704547.html

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

相关文章

香橙派OrangePi AIpro上手初体验

一、前言 非常感谢能够收到CSDN和香橙派的OrangePi AIpro开发板评测活动的邀请&#xff1b;收到的OrangePi AIpro实物如下所示&#xff1a; 二、OrangePi AIpro介绍 通过查询香橙派官网可以了解到OrangePi AIpro的相关信息如下&#xff1a;OrangePi AIPro 开发板是香橙派联合…

浙江大学数据结构MOOC-课后习题-第七讲-图4 哈利·波特的考试

题目汇总 浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024 题目描述 代码展示 照着教程视频来的&#xff0c;没啥好说的捏 #include <cstdlib> #include <iostream>#define MAXSIZE 100 #define IFINITY 65535 typedef int vertex; typedef int weightType;/…

【StableDiffusion】SD1.4、1.5、2.0、2.1 和 SDXL0.9-1.0、SDXL turbo 等的区别

总览 1.基础sd base model家族&#xff1a;SD1.4、SD1.5、SD1.5-LCM、SD2.0、SD2.0-768、SD2.1、SD2.1-768、SD2.1-UNCLIP 2.升级sdxl base model家族&#xff1a;SDXL0.9、SDXL1.0、SDXL1.0-LCM、SDXL-DISTILLED、SDXL-TURBO 3.专门用于视频生成的 SVD 家族&#xff1a;SVD、…

洪师傅代驾系统开发 支持公众号H5小程序APP 后端Java源码

代驾流程图 业务流程图 管理端设置 1、首页装修 2、师傅奖励配置 师傅注册后,可享受后台设置的新师傅可得的额外奖励; 例:A注册了师傅,新人奖励可享受3天,第一天的第一笔订单完成后可得正常佣金佣金*奖励比例 完成第二笔/第三笔后依次可得正常佣金佣金*奖励比例 完成的第四…

城市空气质量数据爬取分析可视化

城市空气质量数据爬取分析可视化 一、效果展示二、完整代码2.1 数据爬取代码2.2 数据分析代码一、效果展示 先来看一下数据情况以及可视化效果,本项目使用了pyecharts绘制了日历图、雷达图、折线图、柱状图、饼图和平行坐标系。完整代码附后: 数据如下: 日历图: 饼图: …

Docker基础篇之常用命令

文章目录 1. 帮助启动类命令2. 镜像命令3. 容器命令4. 总结 1. 帮助启动类命令 启动docker&#xff1a; systemctl start docker停止docker&#xff1a; systemctl stop docker重启docker&#xff1a; systemctl restart docker查看docker 的运行状态&#xff1a; systemc…

ubuntu 22.04 appearance设置没有dock选项

1、问题描述 解决办法可以直接跳到后面见2 下图是我同学电脑的appearance界面选项&#xff0c;她有Dock的界面显示。 下面是我的界面&#xff0c; 没有Dock&#xff1a; 然后各种app的界面都在最底下&#xff0c;而且每次只能点击左上角的activities才能显示。 但是如果不打开某…

YoloV8实战:各种图绘制汇总(mAP50、mAP50-95、loss、PR_curve、F1_curve)|科研必备|绘图神器

摘要 本文的内容是告诉大家如何绘制mAP50、mAP50-95、loss、PR_curve、F1_curve等图像,方便大家写论文。 绘制mAP50、mAP50-95、loss等图。 先上效果,如下图: 首先将,训练的result.csv汇总到一个文件夹下面(这样方便寻找),要不然找起来太麻烦。如下图: 我都放到re…

STM32H750外设之ADC通道选择

目录 概述 1 通道选择功能介绍 2 通道选择&#xff08; SQRx、 JSQRx&#xff09; 2.1 通道复用 2.1.1 通道介绍 2.1.2 通道框图 2.2 转换分组 2.3 内部专用通道 3 通道预选寄存器 (ADCx_PCSEL) 3.1 功能介绍 3.2 预选通道寄存器 概述 本位主要介绍STM32H750外设之…

【钉钉AI助理】测试用例创造师,快速生成高质量的测试用例!

前言&#xff1a; 我最近发现了个提升工作效率的秘密武器——钉钉AI助理里的‘测试用例创造师’。 试了下&#xff0c;简直是工作中的小确幸&#xff0c;既增加了乐趣&#xff0c;又真的帮了大忙。往里一粘需求&#xff0c;唰唰几下&#xff0c;各种测试场景就蹦出来了&#…

188M2传奇BLUEM2引擎源码开源版附带编译教程2024最新开源

2024最新开源188M2传奇BLUEM2引擎源码开源2版最初开源版本附带编译教程 源码下载地址&#xff1a;极速云 如果需要优惠可以选择第一版最初开源188M2传奇BLUEM2引擎源码开源1版最初开源版本附带编译教程2024最新开源

帆软生成csv文件

帆软官网提供了导出csv文件的插件&#xff0c;需要下载指定版本的插件 请选择具体的详情点击官网介绍&#xff1a;文档介绍 插件地址&#xff1a;插件地址

Monocular Model-Based 3D Tracking of Rigid Objects:2005年综述

1 Introduction 在视频序列中跟踪一个物体意味着在物体或摄像机移动时&#xff0c;持续识别其位置。根据物体类型、物体和摄像机的自由度以及目标应用的不同&#xff0c;有多种方法可供选择。二维跟踪通常旨在跟踪物体或物体部分的图像投影&#xff0c;这些物体的三维位移会导…

微信资源混淆,导致的约束布局 Constraintlayout 控件重叠!

问题 1、广告六要素 虽然我不参与广告 sdk 接入等相关工作&#xff0c;但是最近总是听到一个词广告六要素。这到底是什么&#xff1f; 国内下载类广告&#xff0c;尤其是针对移动应用推广的广告&#xff0c;其成功实施往往围绕几个关键要素进行&#xff0c;这些要素能够帮助…

互联网政务应用安全管理规定:使用安全连接方式访问

前几日&#xff0c;由中央网络安全和信息化委员会办公室、中央机构编制委员会办公室、工业和信息化部、公安部等4部门联合制定的《互联网政务应用安全管理规定》&#xff08;以下简称规定&#xff09;发布了&#xff0c;规定定义了互联网政务应用&#xff0c;也对互联网政务应用…

stream-并行流

定义 常规的流都是串行的流并行流就是并发的处理数据&#xff0c;一般要求被处理的数据互相不影响优点&#xff1a;数据多的时候速度更快&#xff0c;缺点&#xff1a;浪费系统资源&#xff0c;数据少的时候开启线程更耗费时间 模版 Stream<Integer> stream1 Stream.of…

拿捏数据结构- 链式二叉树

链式二叉树的概念&#xff1a; 链式二叉树解决的是非完全二叉树解决不了的问题 什么意思呢&#xff0c;简单的说就是&#xff0c;链式二叉树 可以是下面三种二叉树 但是非链式二叉树只能是前两种 链式二叉树的存储 节点结构&#xff1a;首先定义一个结构体或类来表示二叉树的节…

快速上手 HuggingFace

HuggingFace HuggingFace 是类似于 GitHub 的社区&#xff0c;它主要提供各种的模型的使用&#xff0c;和 github 不同的是&#xff0c;HuggingFace 同时提供了一套框架&#xff0c;进行模型推理&#xff0c;模型训练、和模型库文件的管理等等。本文将介绍&#xff0c;如何快速…

大字体学生出勤记录系统网页源码

源码介绍 上课需要一个个点名记录出勤情况&#xff0c;就借助AI制作了一个网页版学生出勤记录系统&#xff0c; 大字体显示学生姓名和照片&#xff0c;让坐在最后排学生也能看清楚&#xff0c;显示姓名同时会语音播报姓名&#xff0c; 操作很简单&#xff0c;先导入学生姓名…

Golang | Leetcode Golang题解之第115题不同的子序列

题目&#xff1a; 题解&#xff1a; func numDistinct(s, t string) int {m, n : len(s), len(t)if m < n {return 0}dp : make([][]int, m1)for i : range dp {dp[i] make([]int, n1)dp[i][n] 1}for i : m - 1; i > 0; i-- {for j : n - 1; j > 0; j-- {if s[i] …