秋招突击——算法打卡——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 ++;
                }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开始吧

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Reactor模式Proactor模式

1.Reactor/Dispatcher模式 1.1 概述 Reactor模式下&#xff0c;服务端的构成为Reactor 处理资源池。其中&#xff0c;Reactor负责监听和分发事件&#xff0c;而处理资源池则负责处理事件。 该模式下的组合方案有下面几种(第三种几乎没有被实际应用)&#xff1a; 1 * Reacto…

CRLF注入漏洞

1.CRLF注入漏洞原理 Nginx会将 $uri进行解码&#xff0c;导致传入%0a%0d即可引入换行符&#xff0c;造成CRLF注入漏洞。 执行xss语句 2.漏洞扩展 CRLF 指的是回车符(CR&#xff0c;ASCII 13&#xff0c;\r&#xff0c;%0d) 和换行符(LF&#xff0c;ASCII 10&#xff0c;\n&am…

栈 队列

目录 1.1栈的基本概念 1.1.1栈的定义 1.1.2栈的基本操作 1.2栈的顺序存储结构 1.2.1构造原理 1.2.2基本算法 1.3栈的链式存储结构 1.3.1构造原理 1.3.2基本算法 2.1队列的基本概念 2.1.1队列的定义 2.1.2队列的基本运算 2.2队列的顺序存储结构 2.2.1构造原理 2.2.1基…

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

题目&#xff1a; 题解&#xff1a; class Solution { public:int numDistinct(string s, string t) {int m s.length(), n t.length();if (m < n) {return 0;}vector<vector<unsigned long long>> dp(m 1, vector<unsigned long long>(n 1));for (i…

通过Zerossl给IP申请免费SSL证书, 实现https ip访问

参考通过Zerossl给IP申请免费SSL证书 | LogDicthttps://www.logdict.com/archives/tong-guo-zerosslgei-ipshen-qing-mian-fei-sslzheng-shu

软件系统开发标准流程文档(Word原件)

目的&#xff1a;规范系统开发流程&#xff0c;提高系统开发效率。 立项申请需求分析方案设计方案评审开发调整测试阶段系统培训试运行测试验收投入使用 所有文档过去进主页获取。 软件项目相关全套精华资料包获取方式①&#xff1a;点我获取 获取方式②&#xff1a;本文末个人…

【cocos creator 】生成六边形地图

想要生成一个六边形组成的地图 完整代码示例 以下是完整的代码示例&#xff0c;包含了注释来解释每一步&#xff1a; cc.Class({extends: cc.Component,properties: {hexPrefab: {default: null,type: cc.Prefab},mapWidth: 10, // 网格的宽度&#xff08;六边形的数量&am…

(delphi11最新学习资料) Object Pascal 学习笔记---第13章第4节 (内存管理和接口)

13.4 内存管理和接口 ​ 在第11章中&#xff0c;我介绍了接口的内存管理的关键要素。与对象不同&#xff0c;接口是受管理且具有引用计数。如我所提到的&#xff0c;接口引用会增加所引用对象的引用计数&#xff0c;但您可以声明接口引用为弱引用以禁用引用计数&#xff08;但…

Prometheus Operator创建告警规则并接入钉钉报警

prometheus之钉钉报警 前言1. 添加prometheus报警规则1.2 添加自定义报警规则文件 2. 配置钉钉报警2.2 部署dingding插件 3. 编写alertmanager配置文件 前言 在kubenetes上安装了kube-promethues&#xff08;包含Prometheus Operator&#xff09;,程序正常跑起来了&#xff0c…

Transformer详解(4)-前馈层残差连接层归一化

1、前馈层 前馈层接收自注意力层的输出作为输入。 from torch import nn import torch.nn.functional as Fclass FeedForward(nn.Module):def __init__(self, d_model512, d_ff2048, dropout0.1):super().__init__()# d_ff 默认设置为2048self.linear_1 nn.Linear(d_model,…

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

题目&#xff1a; 题解&#xff1a; class Solution:def numDistinct(self, s: str, t: str) -> int:m, n len(s), len(t)if m < n:return 0dp [[0] * (n 1) for _ in range(m 1)]for i in range(m 1):dp[i][n] 1for i in range(m - 1, -1, -1):for j in range(n …

自适应容积卡尔曼滤波|(自适应CKF)的MATLAB源代码

介绍 容积卡尔曼滤波在理论上拥有比UKF更高的精度和稳定性&#xff0c;本自适应算法通过对观测残差的计算&#xff0c;在观测协方差R不准确或无法获得时&#xff0c;对R进行调节&#xff0c;以起到降低估计误差的作用。 模型 使用的是三维的非线性模型&#xff0c;经过适当修…

计算机网络导论

网络结构的演变 网状结构 最开始的网络&#xff0c;主机之间都是两两相连 好处 这样连接&#xff0c;好处是安全性比较高&#xff08;A与B之间的连线断了&#xff0c;可以绕一下C&#xff09;&#xff1b; 另外通信不需要互相等待&#xff08;没有中间交换设备&#xff0c;所…

Vue3_创建项目

目录 一、创建vue项目 1.下载vue 2.进入刚才创建的项目 3.安装依赖 4.运行项目 ​5.打包项目放入生产环境 二、vue项目组成 1.项目文件结构 2.项目重要文件 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、C…

QQ名片满级会员展示生成HTML源码

源码介绍 QQ名片满级会员展示生成HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;保存素材去选择QQ个性名片-选择大图模板-把图上传照片墙即可 源码效果 源码下载 蓝奏云&#xff1a;http…

OrangePi Kunpeng Pro 开箱测评之一步到喂

前情提要&#xff1a;大家好&#xff0c;我是Samle。有幸接到 CSDN 发来的测评邀请&#xff0c;下面针对 OrangePi Kunpeng Pro 开发板进行一些实践操作&#xff0c;让大家能更好的上手这块板子。 以下内容来自 官方说明 OrangePi Kunpeng Pro采用4核64位处理器AI处理器&#…

【Linux-RTC】

Linux-RTC ■ rtc_device 结构体■ RTC 时间查看与设置■ 1、时间 RTC 查看■ 2、设置 RTC 时间 ■ rtc_device 结构体 Linux 内核将 RTC 设备抽象为 rtc_device 结构体 rtc_device 结构体&#xff0c;此结构体定义在 include/linux/rtc.h 文件中 ■ RTC 时间查看与设置 ■ 1…

SpringBoot 结合 WebSocket 实现聊天功能

目录 一、WebSocket 介绍 二、源码 2.1 pom.xml 2.2 WebSocket配置类&#xff0c;用于配置WebSocket的相关设置 2.3 自定义WebSocket处理器类&#xff0c;用于处理WebSocket的生命周期事件 2.4 自定义WebSocket握手拦截器&#xff0c;用于增强WebSocket的握手过程 2.5 Ses…

衍生品赛道的 UniSwap:SynFutures 或将成为行业领军者

经过一个周期的发展&#xff0c;DeFi 已经成为基于区块链构建的最成功的去中心化应用&#xff0c;并彻底改变了加密市场的格局。加密货币交易开始逐步从链下转移到链上&#xff0c;并从最初简单的 Swap 到涵盖借贷、Staking、衍生品交易等广泛的生态系统。 在 DeFi 领域&#x…

stream-并行流

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