C++ mapsetOJ

news2024/11/25 22:34:42

目录

1、138. 随机链表的复制

2、692. 前K个高频单词

3、349. 两个数组的交集


1、138. 随机链表的复制

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;

    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/

class Solution {
public:
    Node* copyRandomList(Node* head) {
        map<Node*, Node*> copyNodeMap;
        Node* cur = head;
        Node *copyhead, *copytail;
        copyhead = copytail = nullptr;
        while (cur) {
            Node* copy = new Node(cur->val);
            copyNodeMap[cur] = copy;
            if (copytail == nullptr) {
                copytail = copyhead = copy;
            } else {
                copytail->next = copy;
                copytail = copytail->next;
            }
            cur = cur->next;
        }

        cur = head;
        Node* copy = copyhead;
        while (cur) {
            if (cur->random == nullptr) {
                copy->random = nullptr;
            } else {
                copy->random = copyNodeMap[cur->random];
            }
            cur = cur->next;
            copy = copy->next;
        }
        return copyhead;
    }
};
  • 代码首先创建一个map(copyNodeMap)用于存储原节点和对应的拷贝节点的映射关系。然后遍历原链表,对每个节点进行拷贝,并将原节点和拷贝节点的映射关系存储到copyNodeMap中。同时,根据拷贝节点的顺序构建新的链表,即将拷贝节点按顺序连接起来。
  • 接下来,再次遍历原链表,将拷贝节点的random指针指向对应的拷贝节点。如果原节点的random指针为空,则拷贝节点的random指针也为空;否则,拷贝节点的random指针指向copyNodeMap中对应原节点的拷贝节点。
  • 最后,返回拷贝链表的头节点copyHead。

2、692. 前K个高频单词

思路1:使用map进行单词计数,然后将计数结果转换为vector进行排序,最后返回前k个出现次数最多的单词。排序的依据是出现次数,如果出现次数相同,则按照字典顺序排序。 

class Solution {
public:
    struct Compare {
        bool operator()(const pair<string, int>& kv1,
                        const pair<string, int>& kv2) {
            return kv1.second > kv2.second;
        }
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string, int> countMap;
        for (auto& a : words) {
            countMap[a]++;
        }

        vector<pair<string, int>> v(countMap.begin(), countMap.end());
        //stable_sort保持相同出现次数的单词的相对顺序不变
        stable_sort(v.begin(), v.end(), Compare());
        vector<string> ret;
        for (size_t i = 0; i < k; i++) {
            ret.push_back(v[i].first);
        }
        return ret;
    }
};

思路2:或者不使用stable_sort,在仿函数处控制比较逻辑实现单词的相对顺序不变。 

class Solution {
public:
    struct Compare {
        bool operator()(const pair<string, int>& kv1,
                        const pair<string, int>& kv2) {
            return kv1.second > kv2.second ||
                   (kv1.second == kv2.second && kv1.first < kv2.first);
        }
    };
    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string, int> countMap;
        for (auto& a : words) {
            countMap[a]++;
        }

        vector<pair<string, int>> v(countMap.begin(), countMap.end());
        sort(v.begin(), v.end(), Compare());
        vector<string> ret;
        for (size_t i = 0; i < k; i++) {
            ret.push_back(v[i].first);
        }
        return ret;
    }
};

思路3:通过使用map统计单词出现次数,然后使用multiset进行排序,最后返回出现频率最高的前k个单词。

class Solution {
public:
    struct Compare {
        bool operator()(const pair<string, int>& kv1, 
                        const pair<string, int>& kv2) const {
            return kv1.second > kv2.second || 
                        (kv1.second == kv2.second && kv1.first < kv2.first);
        }
    };

    vector<string> topKFrequent(vector<string>& words, int k) {
        map<string, int> countMap;
        for (auto& str : words) {
            countMap[str]++;
        }

        multiset<pair<string, int>, Compare> sortSet(countMap.begin(), countMap.end());

        vector<string> ret;
        auto it = sortSet.begin();
        while (k--) {
            ret.push_back(it->first);
            ++it;
        }
        return ret;
    }
};

3、349. 两个数组的交集

找交集思路:

  1. 如果两个元素不相等,那么较小的元素向后移动一位。
  2. 如果两个元素相等,那么它们就是交集的元素,将它们添加到结果中,并将两个指针都向后移动一位。
  3. 任意一个集合走完则查找结束。

找差集也可以借鉴交集思路:

  1. 如果两个元素相等,那么它们不是差集的元素,将两个指针都向后移动一位。
  2. 如果两个元素不相等,那么较小的元素就是差集的元素,将它添加到结果中,并将较小的指针向后移动一位。
  3. 当其中一个集合的指针走完了,剩下的另一个集合中的元素都是差集的元素。
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        set<int> s1(nums1.begin(), nums1.end());
        set<int> s2(nums2.begin(), nums2.end());
        auto it1 = s1.begin();
        auto it2 = s2.begin();
        vector<int> v;
        while (it1 != s1.end() && it2 != s2.end()) {
            if (*it1 < *it2)
                ++it1;
            else if (*it2 < *it1)
                ++it2;
            else {
                v.push_back(*it1);
                it1++, it2++;
            }
        }
        return v;
    }
};

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

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

相关文章

vscode开发java项目

安装java扩展 创建项目 vscode命令行面板搜索java命令行 出现如下提示 No build tools构建项目如下 java项目使用vscode单独打开文件夹&#xff08;工作区中运行有问题&#xff09;&#xff0c;vscode中可直接点击右上角运行按钮执行 maven中spring boot项目 代码错误可以点…

Chrome 浏览器插件 cookies API 解析

Chrome.cookie 前端开发肯定少不了和 cookie 打交道&#xff0c;此文较详细的介绍下 chrome.cookie 的 API 以及在 popup、service worker、content 中如何获取的 一、权限&#xff08;Permissions&#xff09; 如果需使用 Cookie API&#xff0c;需要在 manifest.json 文件…

第90讲:MySQL数据库主从复制集群原理概念以及搭建流程

文章目录 1.MySQL主从复制集群的核心概念1.1.什么是主从复制集群1.2.主从复制集群中的专业术语1.3.主从复制集群工作原理1.4.主从复制中的小细节1.5.搭建主从复制集群的前提条件1.6.MySQL主从复制集群的架构信息 2.搭建MySQL多实例环境2.1.在mysql-1中搭建身为主库的MySQL实例2…

2024年1月中国数据库排行榜: OPOT 组合续写贺新年,达梦、腾讯发力迎升势

2024年开局&#xff0c;墨天轮中国数据库流行度排行火热出炉&#xff0c;292个国产数据库齐聚榜单。整体来看&#xff0c;榜单前十整体变化不大&#xff0c;“O-P-O”格局稳固&#xff0c;前五位名次未发生变动。但新年伊始&#xff0c;各家数据库热度上升迅猛&#xff0c;分数…

Linux下进程子进程的退出情况

进程的退出分为了两大类&#xff0c;一类是正常的退出&#xff0c;另一类是非正常的退出。 正常退出时有五种情况&#xff0c;分别是 ①main函数调用return ②进程调用exit(),标准c库 ③进程调用_exit()或者_Exit()&#xff0c;属于系统调用 ④进程最后一个线程返回 ⑤最…

密码产品推介 | 沃通安全电子签章系统(ES-1)

产品介绍 沃通安全电子签章系统&#xff08;ES-1&#xff09;是一款基于密码技术、完全自主研发的商用密码产品&#xff0c;严格遵循国家密码管理局制定的相关标准&#xff0c;可为企业和个人提供安全、合规的电子签章功能服务。产品的主要用途是为各类文书、合同、表单等电子…

Java-NIO 开篇(1)

NIO简介 高性能的Java通信&#xff0c;离不开Java NIO组件&#xff0c;现在主流的技术框架或中间件服务器&#xff0c;都使用了Java NIO组件&#xff0c;譬如Tomcat、 Jetty、 Netty、Redis、RabbitMQ等的网络通信模块。在1.4版本之前&#xff0c; Java IO类库是阻塞式IO&…

如何将信用卡或借记卡关联到您的PayPal账户

第1步&#xff1a;在PayPal控制面板中关联 您在登录到PayPal账户之后&#xff0c;前往顶部菜单条中的 “钱包”&#xff0c;然后点击“关联卡”。 第2步&#xff1a;输入您的信用卡或借记卡详情 第3步&#xff1a;添加新的借记卡或信用卡 使用PayPal绑定信用卡吧&#xff0c;…

Node.js基础---fs文件系统 读取和写入

什么是nodejs? 脚本语言需要一个解析器才能运行&#xff0c;JavaScript是脚本语言&#xff0c;在不同的位置有不一样的解析器&#xff0c;如写入html的js语言&#xff0c;浏览器是它的解析器角色。而对于需要独立运行的JS&#xff0c;nodejs就是一个解析器。 每一种解析器都是…

vue3项目eslint配置、配置prettier(格式化配置)

文章链接: 全部配置链接 第一步:eslint配置、配置prettier(代码格式化):点击链接 (1) .eslint.cjs—eslint配置文件 (2).eslintignore—校验忽略文件 (3).prettierrc.json添加规则 (4).prettierignore忽略文件 prettierrc规范说明: 第二步:styleLint配置 样式链接 第三…

迭代器模式介绍

目录 一、迭代器模式介绍 1.1 迭代器模式定义 1.2 迭代器模式原理 1.2.1 迭代器模式类图 1.2.2 模式角色说明 1.2.3 示例代码 二、迭代模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 抽象迭代类 2.2.2 抽象集合类 2.2.3 主题类 2.2.4 具体迭代类 2.2.5 具体集合类 …

云边协同的 RTC 如何助力即构全球实时互动业务实践

作者&#xff1a;即构科技 由 51 CTO 主办的“WOT 全球技术创新大会 2023深圳站”于 11 月 24 日 - 25 日召开&#xff0c;即构科技后台技术总监肖潇以“边缘容器在全球音视频场景的探索与实践”为主题进行分享。 边缘计算作为中心云计算的补充&#xff0c;通过边缘容器架构和…

scalpel一款命令行漏洞扫描工具,支持深度参数注入,拥有一个强大的数据解析和变异算法

免责声明 由于传播、利用本文章所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章及作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担&#xff01;如有侵权烦请告知&#xff0c;我们会立即删除并致歉。谢谢&#xf…

javaweb学习day01(HTML)

一、B/S 软件开发架构简述 1 Java Web 技术体系图 2 B/S 软件开发架构简述 B/S架构 前端 后端 数据库 二、HTML 1 官方文档 地址: https://www.w3school.com.cn/html/index.asp 离线文档: W3School 离线手册(2017.03.11 版).chm 2 网页 3 HTML 介绍 3.1 HTML 是什么…

vue基于Spring Boot的中医在线学习课程购买服务管理系统

SpinrgBoot的主要优点有&#xff1a; 1、为所有spring开发提供了一个更快、更广泛的入门体验&#xff1b; 2、零配置&#xff1b; 3、集成了大量常用的第三方库的配置&#xff1b; 4、提供准备好的特性。当今&#xff0c;nodejs领域的开发者机会都在使用SpinrgBoot,在开发领域逐…

SQL Server Management Studio基础

文章目录 一、SQL Server Management Studio介绍二、创建数据库 一、SQL Server Management Studio介绍 SQL Server Management Studio&#xff08;SSMS&#xff09;是用于管理和操作Microsoft SQL Server数据库的集成环境。用力啊方便管理员和开发人员进行数据库管理、查询、…

云轴科技ZStack 助力广西某地级市建设市级警务云视频系统

某市属于广西壮族自治区辖地级市&#xff0c;省域副中心城市&#xff0c;选择云轴科技ZStack 超融合解决方案支撑警务云视频监控联网管理系统&#xff08;警务云视频系统&#xff09;&#xff0c;实现了该市对各辖区视频资源统一管理&#xff1b;同时也满足了该市警务云视频系统…

【5G Modem】5G modem架构介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

微信小程序的基础开发

微信小程序目录结构 一个小程序主体部分由三个文件组件&#xff0c;必须放在项目的根目录&#xff0c; 一个小程序page页面由四个文件组件&#xff0c;分别为&#xff1a; ,js文件&#xff1a;用来写JavaScript wxml文件&#xff1a;写页面结构,可以理解为html json: 里面是页…

VsCode + CMake构建项目 C/C++连接Mysql数据库 | 数据库增删改查C++封装 | 信息管理系统通用代码 ---- 课程笔记

这个是B站Up主&#xff1a;程序员程子青的视频 C封装Mysql增删改查操作_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1m24y1a79o/?p6&spm_id_frompageDriver&vd_sourcea934d7fc6f47698a29dac90a922ba5a3安装mysql:mysql 下载和安装和修改MYSQL8.0 数据库存储…