[笔试训练](二十七)109:旋转字符串110:合并k个已排序的链表111:滑雪

news2024/9/22 21:28:48

目录

109:旋转字符串

110:合并k个已排序的链表

111:滑雪


109:旋转字符串

题目链接:旋转字符串_牛客题霸_牛客网 (nowcoder.com)

题目:

题解:

class Solution {
public:

    bool solve(string A, string B) 
    {
        int n=A.size();
        if(n!=B.size()) return false;
        for(int i=0;i<n;i++)
        {
            int j=0;
            if(A[i]==B[j])
            {
                int left=i,right=j;
                while(A[left]==B[right])
                {
                    left++;
                    left%=n;
                    right++;
                    if(right==n-1) return true;
                }

            }
            
        }
        return false;  
    }
};

110:合并k个已排序的链表

题目链接:合并k个已排序的链表_牛客题霸_牛客网 (nowcoder.com)

题目:

题解:

解法1:建小堆,将所有节点放进堆中,再从堆顶逐个取出组成链表。

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
#include <queue>
class Solution {
public:
	//template<class T>
	class compare
	{
	public:
		bool operator()(const ListNode* x, const ListNode* y)
		{
			return x->val > y->val;
		}
	};

    ListNode* mergeKLists(vector<ListNode*>& lists) 
    {
        ListNode* newhead=new ListNode(0);
        priority_queue<ListNode*, vector<ListNode*>, compare> heap;
        for(int i=0;i<lists.size(); i++)
        {
            ListNode* cur=lists[i];
            while(cur)
            {
                heap.push(cur);
                cur=cur->next;
            }
        }
        ListNode* cur=newhead;
        while(!heap.empty())
        {
            cur->next=heap.top();
            heap.pop();
            cur=cur->next;
        }
        cur->next=nullptr;
        return newhead->next;
    }
};

解法2:使用 std::sort 对所有链表节点指针调用compare()进行排序。

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
#include <queue>
class Solution {
public:
	//template<class T>
	class compare
	{
	public:
		bool operator()(const ListNode* x, const ListNode* y)
		{
			return x->val > y->val;
		}
	};

    ListNode* mergeKLists(vector<ListNode*>& lists) 
    {
        ListNode* newhead=new ListNode(0);
        vector<ListNode*> list;
       
        for(int i=0;i<lists.size(); i++)
        {
            ListNode* cur=lists[i];
            while(cur)
            {
                list.push_back(cur);
                cur=cur->next;
            }
        }
        ListNode* cur=newhead;

        sort(list.begin(), list.end(), compare());
        for(int i=list.size()-1;i>=0;i--)
        {
            cur->next=list[i];
            cur=cur->next;
        }

        cur->next=nullptr;
        return newhead->next;
    }
};

 解法3:因为各个小链表是排好序的,可以先将各个链表头节点加入堆中,从堆顶中找小的插入新链表中再pop()后,将堆顶节点的下一节点重新插入堆。

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
	//template<class T>
	class compare
	{
	public:
		bool operator()(const ListNode* x, const ListNode* y)
		{
			return x->val > y->val;
		}
	};

    ListNode* mergeKLists(vector<ListNode*>& lists) 
    {
        ListNode* newhead=new ListNode(0);
        priority_queue<ListNode*, vector<ListNode*>, compare> heap;
        for(auto head:lists)
        {
            if(head!=nullptr)
            {
                heap.push(head);
            }
        }
        ListNode* cur=newhead;
        while(heap.size())
        {
            ListNode* t=heap.top();
            heap.pop();
            cur->next=t;
            cur=cur->next;
            if(t->next!=nullptr)
            {
                heap.push(t->next);
            }
        }
        cur->next=nullptr;
        return newhead->next;
    }
};

解法4:利用归并排序思想,将链表一层一层向下划分直到为单个链表,再向上合并同时排序链表节点。

class Solution {
  public:
    //两个有序链表合并函数
    ListNode* Merge2(ListNode* pHead1, ListNode* pHead2) {
        //一个已经为空了,直接返回另一个
        if (pHead1 == NULL)
            return pHead2;
        if (pHead2 == NULL)
            return pHead1;
        //加一个表头
        ListNode* head = new ListNode(0);
        ListNode* cur = head;
        //两个链表都要不为空
        while (pHead1 && pHead2) {
            //取较小值的节点
            if (pHead1->val <= pHead2->val) {
                cur->next = pHead1;
                //只移动取值的指针
                pHead1 = pHead1->next;
            } else {
                cur->next = pHead2;
                //只移动取值的指针
                pHead2 = pHead2->next;
            }
            //指针后移
            cur = cur->next;
        }
        //哪个链表还有剩,直接连在后面
        if (pHead1)
            cur->next = pHead1;
        else
            cur->next = pHead2;
        //返回值去掉表头
        return head->next;
    }

    //划分合并区间函数
    ListNode* divideMerge(vector<ListNode*>& lists, int left, int right) {
        if (left > right)
            return NULL;
        //中间一个的情况
        else if (left == right)
            return lists[left];
        //从中间分成两段,再将合并好的两段合并
        int mid = (left + right) / 2;
        return Merge2(divideMerge(lists, left, mid), divideMerge(lists, mid + 1,
                      right));
    }

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        //k个链表归并排序
        return divideMerge(lists, 0, lists.size() - 1);
    }
};

111:滑雪

题目链接:滑雪_牛客题霸_牛客网 (nowcoder.com)

题目:

题解:

dfs+记忆化搜索

#include <iostream>
using namespace std;

const int N=110;
int m=0,n=0;
int board[N][N]={0};
int vis[N][N]={0};

int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};

int dfs(int i, int j)
{
    if(vis[i][j]) return vis[i][j];
    int len=1;
    for(int k=0;k<4;k++)
    {
        int x=i+dx[k], y=j+dy[k];
        if(x>=0 && y>=0 && x<n && y<m && board[x][y] > board[i][j])
        {
            len=max(len, 1+dfs(x, y));
        }
    }
    vis[i][j]=len;
    return len;
}

int main() 
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>board[i][j];
        }
    }

    int ret=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            ret=max(ret, dfs(i,j));
        }
    }
    cout<<ret<<endl;
    return 0;
}

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

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

相关文章

32路串口服务器 应用领域

32路串口服务器在多个领域有着广泛的应用&#xff0c;以下是详细的应用实例&#xff1a; 一、工业自动化 在工业自动化领域&#xff0c;32路串口服务器发挥着举足轻重的作用。传统的工业设备往往采用串口通信方式&#xff0c;而串口服务器能够将这些设备接入网络&#xff0c;…

护网HW面试常问——组件中间件框架漏洞(包含流量特征)

apache&iis&nginx中间件解析漏洞 参考我之前的文章&#xff1a;护网HW面试—apache&iis&nginx中间件解析漏洞篇-CSDN博客 log4j2 漏洞原理&#xff1a; 该漏洞主要是由于日志在打印时当遇到${后&#xff0c;以:号作为分割&#xff0c;将表达式内容分割成两部…

C++基础入门(下)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 C基础入门(下) 收录于专栏【C语法基础】 本专栏旨在分享学习C的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1.函数重载 1.1.参数类…

【调试笔记-20240713-Windows-Tauri 多个HTML页面支持】

调试笔记-系列文章目录 调试笔记-20240713-Windows-Tauri 多个HTML页面支持 文章目录 调试笔记-系列文章目录调试笔记-20240713-Windows-Tauri 多个HTML页面支持 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试目标 二、调试步骤搜索相似问题 三、应用场…

哪些单位和系统需要做等保测评

在信息安全领域&#xff0c;等级保护&#xff08;简称“等保”&#xff09;测评是一项至关重要的工作&#xff0c;旨在确保信息系统的安全性与合规性。本文将详细阐述哪些单位、哪些系统必须进行等保二级或三级测评&#xff0c;并探讨等保测评对企业的重要性。 一、必须进行等保…

【第27章】MyBatis-Plus之Mybatis X 插件

文章目录 前言一、安装指南二、核心功能1.XML 映射跳转2.代码生成3. 重置模板 三、JPA 风格提示四、常见问题解答1. JPA 提示功能无法使用&#xff1f;2. 生成的表名与预期不符&#xff1f; 五、代码生成模板配置1. 默认模板2. 重置默认模板3. 自定义模板内容3.1 实体类信息3.2…

pico+unity3d运行测试方法

一. 发布并运行程序 这个就很简单&#xff0c;电脑和pico数据库连接、pico打开开发者模式、运行的时候选择设备pico 二. pico串流助手 1.需要先下载pico的软件 PICO Developer Center、并安装串流助手、这种方式的话&#xff0c;安装了向日葵的小伙伴可能有冲突、百度一下解…

计算机图形学入门28:相机、透镜和光场

1.前言 相机(Cameras)、透镜(Lenses)和光场(Light Fields)都是图形学中重要的组成部分。在之前的学习中&#xff0c;都是默认它们的存在&#xff0c;所以现在也需要单独拿出来学习下。 2.成像方法 计算机图形学有两种成像方法&#xff0c;即合成(Synthesis)和捕捉(Capture)。前…

java框架-struts2

文章目录 1. struts2访问流程&架构&介绍2. 搭建struts2框架3. strust.xml配置详解4. Action生命周期5. ActionContext内容6. 访问servletAPI方式7. jsp获得8. Action接收参数9. struts、hibernate的javassist-3.18.1-GA.jar包重复,删除版本低的.10. OGNL表达式10.1. OG…

Unity中一键生成具有身体感知的虚拟人物动作

在虚拟现实(VR)和增强现实(AR)的浪潮中&#xff0c;如何让虚拟人物的动作更加自然、真实&#xff0c;已经成为一个重要课题。AI4Animation项目&#xff0c;一个由 Sebastian Starke 主导的开源框架&#xff0c;为Unity开发者提供了强大的工具集&#xff0c;以实现这一目标。本文…

唐刘:当 SaaS 爱上 TiDB(一)- 行业挑战与 TiDB 的应对之道

导读 在 TiDB 8.1 发布后&#xff0c;TiDB 展现了强大的支持 SaaS 业务的能力&#xff0c;成为 SaaS 业务数据库的优先选择之一。 本文为“当 SaaS 爱上 TiDB”系列文章的第一篇&#xff0c;系列文章将从技术原理和真实用户体验两个角度深入探讨 TiDB 在 SaaS 业务中的表现&a…

idm站点抓取可以用来做什么 idm站点抓取能抓取本地网页吗 idm站点抓取怎么用 网络下载加速器

在下载工具众多且竞争激烈的市场中&#xff0c;Internet Download Manager&#xff08;简称IDM&#xff09;作为一款专业的下载加速软件&#xff0c;仍然能够赢得众多用户的青睐&#xff0c;这都要得益于它的强大的下载功能。我们在开始使用IDM的时候总是有很多疑问&#xff0c…

Mysql具体数据操作和表的约束(上)

表中数据的增删改查 插入数据(添加数据) 1.按指定字段插入数据:insert into <表名> (字段1,字段2,...) values (),(),.... 注意1:values后面的括号是指行数(几条记录),一个括号表示插入一条记录,多个括号以此类推 注意2:values后面括号内部插入的数据…

[C++] 由浅入深理解面向对象思想的组成模块

文章目录 (一) 类的默认成员函数(二) 构造函数构造函数的特征构造函数示例无参构造带参构造 冲突:全缺省参数的构造函数与无参构造函数 &#xff08;三&#xff09;析构函数特性析构函数的析构过程解析 &#xff08;四&#xff09;拷贝构造函数什么是拷贝构造&#xff1f;特性为…

Solana Blink和SEND的崛起:技术与市场效应的结合

随着Solana生态系统的不断发展&#xff0c;新的项目和技术不断涌现&#xff0c;吸引了大量的关注和投资。最近&#xff0c;Solana的Blink项目及其相关的SEND代币成为了市场的焦点&#xff0c;引发了广泛的讨论和投资热潮。本文将探讨Blink和SEND的技术创新、市场表现以及未来的…

大模型高效参数微调技术

文章目录 一、Fine-Tuning&#xff1a;微调二、Prompt-Tuning&#xff1a;提示调优2.1 工作原理2.2 PET (Pattern-Exploiting Training)2.3 Prompt-Tuning集成2.4 模板构建方式 三、Prefix Tuning&#xff1a;连续提示模板3.1 提出动机3.2 工作原理 四、P-Tuning V1/V24.1 P-Tu…

NFT如何解决音乐版权的问题

音乐版权问题一直困扰着音乐产业。传统的音乐版权管理模式存在以下问题。需要注意的是&#xff0c;NFT在音乐版权领域仍处于早期发展阶段&#xff0c;存在一些需要解决的问题&#xff0c;例如技术标准不统一、应用场景有限、法律法规不明朗等。但随着技术的进步和市场的完善&am…

【分库】分库的设计与原则、数据分片策略、垂直分库与水平分库、数据库引擎选择与配置优化

目录 引言 分库设计原则 数据分片策略的选择 垂直分库 vs 水平分库的比较 数据库引擎选择与配置优化 引言 在面对日益增长的数据量和不断升级的业务需求时&#xff0c;传统的单体数据库架构往往难以应对高并发、大数据量带来的性能瓶颈。为了突破这些限制&#xff0c;分库…

windows USB 设备驱动开发-USB 功能控制器驱动开发(二)

USB 功能客户端驱动程序使用的 UFX 对象和句柄 USB 函数类扩展 (UFX) 使用 WDF 对象功能来定义这些特定于 USB 的 UFX 对象。 重要的 API UfxDeviceCreateUfxEndpointCreate USB 函数类扩展 (UFX) 使用 WDF 对象功能来定义这些特定于 USB 的 UFX 对象。 这些对象是 WDF 对…

怎样优化 PostgreSQL 中对复杂条件筛选的执行效率?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 怎样优化 PostgreSQL 中对复杂条件筛选的执行效率&#xff1f;一、理解复杂条件筛选的挑战二、优化索引…