【算法题】合并两个有序链表、删除字符串 s1 中在字符串 s2 中出现的字符、求一个论坛一天的在线人数分布

news2024/10/2 10:40:56

合并两个有序链表、删除字符串 s1 中在字符串 s2 中出现的字符、求一个论坛一天的在线人数分布

  • 一、合并两个有序链表
    • 1.1、题目描述
    • 1.2、思路
    • 1.3、代码实现
    • 1.4、小结
  • 二、删除字符串 s1 中在字符串 s2 中出现的字符
    • 2.1、题目描述
    • 2.2、思路
    • 2.3、代码实现
    • 2.4、小结
  • 三、求一个论坛一天的在线人数分布
    • 3.1、题目
    • 3.2、思路
    • 3.3、代码实现
    • 3.4、小结
  • 总结

一、合并两个有序链表

1.1、题目描述

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
在这里插入图片描述

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

1.2、思路

可以如下递归地定义两个链表里的 merge 操作:

list1[0]+merge(list1[1:],list2) list1[0]<list2[0]

list2[0]+merge(list1,list2[1:]) otherwise

​也就是说,两个链表头部值较小的一个节点与剩下元素的merge操作结果合并。

1.3、代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        if(list1==nullptr)
            return list2;
        else if(list2==nullptr)
            return list1;
        else{
            if(list1->val<=list2->val)
            {
                list1->next=mergeTwoLists(list1->next,list2);
                return list1;
            }
            else{
                list2->next=mergeTwoLists(list1,list2->next);
                return list2;
            }
        }
    }
};

1.4、小结

两个链表头部值较小的一个节点与剩下元素的merge操作结果合并。

递归退出条件:哪个链表先空,返回第二个链表。

二、删除字符串 s1 中在字符串 s2 中出现的字符

2.1、题目描述

删除字符串 s1 中在字符串 s2 中出现的字符。

2.2、思路

把 s1 的字符存到一个 set 里面,然后遍历 s2,看是否出现过,出现过就erase 掉。但是直接输出 set 的元素这样会改变顺序,要想顺序不变,就顺序遍历一下 s1 看是否出现,出现就输出。

2.3、代码实现

类方式:

class Solution{
private:
    set<char> s;
public:
    string delstr(string &s1,string &s2)
    {
        int len1=s1.length();
        int i=0;
        for(i=0;i<len1;i++)
        {
            s.insert(s1[i]);
        }
        int len=s2.length();
        for(i=0;i<le;i++)
        {
            if(s.count(s2[i]))
                s.erase(s.find(s2[i]));
        }
        string res;
        for(i=0;i<len1;i++)
        {
              if(s.count(s1[i]))
                  res+=s1[i];
         }
        return res;
    }
}

直接终端输出的方式:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <queue>
#include <map>
using namespace std;
typedef long long LL;
const int maxn=1005;
set<char>s;
int main()
{
    string s1,s2;
    cin>>s1>>s2;
    int len=s1.length();
    for (int i=0;i<len;i++)
        s.insert(s1[i]);
    len=s2.length();
    for (int i=0;i<len;i++)
    {
        if (s.count(s2[i]))
            s.erase(s.find(s2[i]));
    }
    len=s1.length();
    for (int i=0;i<len;i++)
    {
           if (s.count(s1[i]))
                cout<<s1[i];
     }
      cout<<endl;
     return 0;
}

2.4、小结

利用hash的方式去除字符。

三、求一个论坛一天的在线人数分布

3.1、题目

求一个论坛的在线人数,假设有一个论坛,其注册 ID 有两个 亿个,每个 ID 从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。

3.2、思路

一天有3600*24=86400秒;定义一个长度为 86400 的整数数组 int delta[86400],每个整数对应这一秒的人数变化值,可能为正也可能为负。

开始时将数组元素都初始化为 0。

然后依次读入每个用户的登录时间和退出时间,将与登录时间对应的整数值加 1,将与退出时间对应的整数值减 1。这样处理一遍后数组中存储了每秒中的人数变化情况。

定义另外一个长度为 86400 的整数数组 int online_num[86400],每个整数对应这一秒的论坛在线人数。

假设一天开始时论坛在线人数为 0,则第 1 秒的人数 online_num[0]=delta[0]。第n+1 秒的人数 online_num[n]=online_num[n-1]+delta[n]。

这样我们就获得了一天中任意时间的在线人数。

3.3、代码实现

class Solution{
private:
    int delta[86400]={0};
    int online_num[86400]={0};
public:
    void onlineCount(map<int,bool> users)
    {
        for(auto it=users.begin();it!=users,end();i++){
            if(it->second)
                delta[it->first]+=1;
            else
                delta[it->first]-=1;
        }
        online_num[0]=delta[0];
        for(int i=1;i<86400;i++)
            online_num[i]=online_num[i-1]+delta[i];
    }
    int getonlinesec(int sec)
    {
        return online_num[sec];
     }
};

3.4、小结

利用当前结果与前一个结果相关的特性。

总结

一定要做好总结,特别是当没有解出题来,没有思路的时候,一定要通过结束阶段的总结来反思犯了什么错误。解出来了也一定要总结题目的特点,题目中哪些要素是解出该题的关键。不做总结的话,花掉的时间所得到的收获通常只有 50% 左右。

在题目完成后,要特别注意总结此题最后是归纳到哪种类型中,它在这种类型中的独特之处是什么。
在这里插入图片描述

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

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

相关文章

项目进度类知识要点

单代号网络图 六标时法正推法逆推法 六标时法最早开始时间(ES)工期最早完成时间(EF)活动名称/活动编号最迟开始时间(LS)浮动时间(总时差)最迟完成时间(LF) 关键路径、计算项目的总工期 关键路径是最大长度关键路径上的活动是关键活动关键活动之和为总工期 关键路径变化问题…

华为18级工程师三年心血终成趣谈网络协议文档(附大牛讲解)

前言 虽然在大学的时候大家都学过网络协议 &#xff0c;但是肯定感觉网络协议的知识点非常多 &#xff0c;非常复杂。学的时候就浑浑噩噩&#xff0c;真正到了实践中更是糊里糊涂&#xff0c;一旦工作中遇到了网络问题&#xff0c;除了会简单地 ping 几下 &#xff0c;基本没有…

安装Jmeter

Jmeter是Java语言开发,所以需要java环境,所以先安装jdk 1.安装JDK(1.8版本以上) 下载&#xff1a; https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 找到对应的版本: 点击exe文件安装,跟着向导下一步 2.安装jmeter 下载 Jmeter &#xff1a; 版…

【Java】JVM(六)

垃圾回收 分代回收理论 当前商业虚拟机的垃圾回收器&#xff0c;大多遵循“分代收集”的理论来进行设计&#xff0c;这个理论大体上是这么描述的&#xff1a; 1、绝大部分的对象都是朝生夕死。 2、熬过多次垃圾回收的对象就越难回收。 根据以上两个理论&#xff0c;朝生夕…

【Java】JVM学习(四)

对象的分配 JVM中对象的创建过程 对象的内存分配 虚拟机遇到一条new指令时&#xff0c;首先检查是否被类加载器加载&#xff0c;如果没有&#xff0c;那必须先执行相应的类加载过程。 类加载就是把class加载到JVM的运行时数据区的过程。 1&#xff09;检查加载 首先检查这…

从选题、创作、编辑、推广到优化,23个必用的内容营销工具

咱们做内容营销的&#xff0c;要懂营销懂产品&#xff0c;看得懂技术语言&#xff0c;写得了行业洞察&#xff0c;做出来的内容要有创意还要接地气&#xff0c;专业内容也不能落下&#xff0c;除了会写&#xff0c;还要会运营会设计会剪视频&#xff0c;简直就是全才嘛。 但是…

你知道游戏配音怎么制作吗?教你游戏配音教程怎么做

曾经&#xff0c;有一个叫小明的游戏迷&#xff0c;他对于游戏世界充满了热爱和想象。每当他控制着自己喜爱的角色在游戏中冒险时&#xff0c;他总是希望能够为这些角色赋予独特的声音&#xff0c;让它们真正活起来。然而&#xff0c;他却面临一个问题&#xff1a;游戏配音教程…

【CTF-Reverse中的加密算法】密码算法特征识别,变种密码算法分析

上一章中我们带领大家了解了加密算法——RC4,TEA,Base64算法的原理&#xff0c;但是加密算法远不止这些&#xff0c;需要大家自行去学习&#xff0c;在这一章中&#xff0c;我来带领大家了解密码算法特征识别&#xff0c;变种密码算法分析。 一.密码算法特征识别 1.什么是特征…

详解MySQL的常用数据类型

文章目录 一、MySQL 数据类型1.1、mysql中编码和字符 二、数值类型2.1、整数类型的长度2.2、浮点型 三、字符串类型3.1、字符串类型长度 四、日期和时间类型4.1、DATETIME 五、二进制数据类型六、使用建议 一、MySQL 数据类型 MySQL支持很多数据类型&#xff0c;以便我们能在复…

实现定时任务

1 问题 定时任务中&#xff0c;每天统计一下今日博客的各项数据&#xff0c;并以邮件的形式发送给自己。 2 方法 .首先在某目录下新建任务文件 crontest.cron&#xff0c;用于存在定时任务语句。.相同目录新建 hello.py 文件&#xff0c;并且编辑这个文件写一句简单的 print(He…

【JUC进阶】05. 偏向锁

目录 1、前言 2、偏向锁 2.1、基本原理 2.2、使用场景 3、获取偏向锁 4、何时撤销 4.1、到达安全点 4.2、其他线程尝试竞争偏向锁 4.3、重新计算hashcode 5、小结 1、前言 偏向锁是Java并发编程中一种重要的锁机制&#xff0c;它针对特定的线程进行优化&#xff0c;…

项目集活动—项目集收尾阶段活动

项目集收尾阶段活动从项目集组件完成了所有输出的交付&#xff0c;且项目集开始交付预期效益。某些情况下&#xff0c;项目集治理可能决定在所有组件完成之前就提前执行项目集收尾。无论哪种情况&#xff0c;此阶段项目集活动的目标都是释放项目集资源&#xff0c;支持将剩余项…

区分BOM和DOM,区分window、document、html、body

https://blog.csdn.net/xswl134679/article/details/128795161 JavaScript三大组成部分 1. ECMAScript ECMAScript是JavaScript的语法标准&#xff0c;由ECMA&#xff08;欧洲计算机厂家协会&#xff09;制定的。 2. BOM BOM即浏览器对象模型&#xff08;brower object mode…

Contrastive Learning in Image (CVPR 2023)

文章目录 1. Open Vocabulary Semantic Segmentation with Patch Aligned Contrastive Learning &#xff08;图文匹配&#xff09;1.目标2.任务类型3.解决思路4. 总结 2. MaskCLIP: Masked Self-Distillation Advances Contrastive Language-Image Pretraining &#xff08;图…

数学模型在水环境评价、防洪评价、排污口论证、水质、水量、水生态、水动力等方面的应用

目录 专题一、一维水动力模型模拟一河道水流的应用 专题二、一维复杂河网模型构建及建筑物设置 专题三、一维水质模型在环境影响评价中的应用 专题四、平面二维水动力模型的构建河验证 专题五、平面二维水动力模型在防洪影响评价中的应用 专题六、平面二维水动力水质模型…

抖音kol投放模型怎么打造,营销策略规划

这是一个内容为王的时代&#xff0c;想要在小红书这种内容平台做好内容营销&#xff0c;一定要了解抖音kol投放模型怎么打造&#xff0c;营销策略规划。 一、如何进行kol投放 品牌想要完成一次高效而准确的完成kol投放模型&#xff0c;需要完整的品牌投放策略。针对于小红书平台…

如何驯化机器狗读懂人类手势,手把手教你!

作为全国普通高校大学生竞赛榜单内竞赛&#xff0c;“中国软件杯”大学生软件设计大赛-智能四足机器狗电力巡检系统开发赛项&#xff0c;目前已吸引了全国2041支队伍参加。经过激烈的目标检测与分割算法打榜赛&#xff0c;最终&#xff0c;有153支团队成功晋级区域赛。在即将于…

知乎财报预测:知乎2023年Q2收入将继续下滑,净亏损将扩大一倍

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 华尔街分析师对知乎2023年第二季度财报的预测 在5月24日发布第一季度业绩时&#xff0c;知乎&#xff08;ZH&#xff09;并未对2023年第二季度或2023财年全年提供任何具体的指引。但目前卖方分析师的一致财务预测表明&…

F-35飞控系统详解

基于非线性动态逆(NDI)的控制律 1. F-35飞控控制律 F-35采用了由三台冗余机载管理计算机&#xff08;VMC&#xff0c;Vehicle Management Computers&#xff09;中运行的非线性动态逆控制架构来提供电传飞行控制。F-35的控制律不仅能增强飞机动力学特性实现增稳&#xff0c;还…

java学习记录之JDBC2

1 JDBC回顾  Statement 语句执行者 Connection conn null; Statement st null; ResultSet rs null; try{ //1 通过工具类获得连接 conn JdbcUtils.getConnection(); //2 获得语句执行者 st conn.createStatement() --> 参数 结果集类型、并发参数 &#xff08;滚动结…