D358周赛复盘:哈希表模拟⭐⭐+链表乘法翻倍运算(先反转)⭐⭐⭐

文章目录

    • 2815.数组中的最大数对和
      • 思路
      • 完整版
    • 2816.翻倍以链表形式表示的数字(先反转,再处理进位)
      • 思路
      • 完整版
    • 补充:206.反转链表(双指针法)
      • 完整版
    • 2817.限制条件下元素之间的最小绝对差(cpp不知道为什么超时了,java可以)

2815.数组中的最大数对和

给你一个下标从 0 开始的整数数组 nums 。请你从 nums 中找出和 最大 的一对数,且这两个数数位上最大的数字相等。

返回最大和,如果不存在满足题意的数字对,返回 -1

示例 1:

输入:nums = [51,71,17,24,42]
输出:88
解释:
i = 1 和 j = 2 ,nums[i] 和 nums[j] 数位上最大的数字相等,且这一对的总和 71 + 17 = 88 。 
i = 3 和 j = 4 ,nums[i] 和 nums[j] 数位上最大的数字相等,且这一对的总和 24 + 42 = 66 。
可以证明不存在其他数对满足数位上最大的数字相等,所以答案是 88 。

示例 2:

输入:nums = [1,2,3,4]
输出:-1
解释:不存在数对满足数位上最大的数字相等。

提示:

  • 2 <= nums.length <= 100
  • 1 <= nums[i] <= 104

思路

本题需要用哈希表来做,我们需要对应每个数位最大数字相应的数值

完整版

  • 注意是找一对数字,也就是只找两个数字。因此哈希表里面要存储每个数位最大数字对应的那个数字的值
class Solution {
public://获取数字最大位int getMaxDigit(int num){int maxDigit =-1;//只要Num存在就继续while(num){maxDigit=max(maxDigit,num%10);//单个数字比较,%10得到单个数字num/=10;//去掉最后一位}return maxDigit;}int maxSum(vector<int>& nums) {//创建哈希表存储最大位和与其关联的数字最大值unordered_map<int,int>maxDigitMap;int result=-1;int maxD=-1;for(int num:nums){maxD=getMaxDigit(num);//如果这个数字已经在哈希表里面if(maxDigitMap.count(maxD)){//累积结果取最大值result = max(result,maxDigitMap[maxD]+num);//注意:目标是找到和最大的一对数字,也就是两个数字!所以哈希表要存储最大的数字maxDigitMap[maxD]=max(maxDigitMap[maxD],num);//更新最大位相同数字的和}else{maxDigitMap[maxD]=num;}}return result;}
};

2816.翻倍以链表形式表示的数字(先反转,再处理进位)

给你一个 非空 链表的头节点 head ,表示一个不含前导零的非负数整数。

将链表 翻倍 后,返回头节点 head

示例 1:
在这里插入图片描述

输入:head = [1,8,9]
输出:[3,7,8]
解释:上图中给出的链表,表示数字 189 。返回的链表表示数字 189 * 2 = 378 。

示例 2:

在这里插入图片描述

输入:head = [9,9,9]
输出:[1,9,9,8]
解释:上图中给出的链表,表示数字 999 。返回的链表表示数字 999 * 2 = 1998 。

提示:

  • 链表中节点的数目在范围 [1, 10^4]
  • 0 <= Node.val <= 9
  • 生成的输入满足:链表表示一个不含前导零的数字,除了数字 0 本身。

思路

  1. 反转链表:

    为了方便计算,我们首先将链表反转。这样我们可以从数字的低位(链表的头部)开始处理,方便处理进位。例如数字 189 的链表 [1, 8, 9] 反转后会变成 [9, 8, 1]

  2. 翻倍处理:

    • 对每一个节点,翻倍它的值并加上可能的进位(carry)。例如,如果当前节点的值为9,翻倍后是18,再加上可能的进位,这样这个节点的新值就是8,进位就是1。
    • 这个进位会被加到下一个节点的值上,这样一直处理到链表的尾部。
    • 如果链表的最后一个节点有进位,就需要添加一个新的节点来存储这个进位。
  3. 再次反转链表:

    在完成上述的翻倍处理后,链表仍然是反转的状态,所以我们需要再次反转它以得到正确的答案。

这种方法的好处是我们只需要遍历两次链表,一次是反转,一次是翻倍处理,所以总体的时间复杂度是 O(n),其中 n 是链表的长度。

完整版

  • 注意乘法的处理方式,先反转,再相乘,相乘完了之后更新进位。(注意相乘的时候要加上进位)
  • 如果是最后一个数字且进位不为0,那么需要再加一个数值为0的空节点,用于存放carry!
/*** 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* reverseList(ListNode* head){ListNode* cur = head;ListNode* pre = nullptr;while(cur!=nullptr){ListNode* temp = cur->next;cur->next=pre;pre=cur;cur=temp;}return pre;}ListNode* doubleIt(ListNode* head) {if(head==nullptr) return nullptr;//反转链表head = reverseList(head);//创建一个指针指向链表头部ListNode* cur = head;int carry=0;//初始化进位是0//遍历链表while(cur!=nullptr){int temp = cur->val *2 + carry;//加上进位,和普通乘法一样cur->val = temp%10;//当前节点数值是加上进位后的个位数carry = temp/10;//更新进位//注意特殊情况!如果当前节点是链表最后一个并且还有进位if(cur->next==nullptr&&carry){cur->next=new ListNode(0);//增加一个新的节点,用于存放carry}cur = cur->next;}//最后反转链表,返回head = reverseList(head);return head;}
};

补充:206.反转链表(双指针法)

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

在这里插入图片描述

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

在这里插入图片描述

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

题解:206. 反转链表 - 力扣(LeetCode)

在这里插入图片描述

完整版

class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* cur = head;ListNode* pre = nullptr;//pre是cur的前一个节点,也是反转之后当前节点需要指向的节点while(cur!=nullptr){ListNode* temp=cur->next;cur->next=pre;pre=cur;//下一个节点需要指向当前节点cur=temp;//cur访问下一个节点}return pre;}
};

在这里插入图片描述

2817.限制条件下元素之间的最小绝对差(cpp不知道为什么超时了,java可以)

给你一个下标从 0 开始的整数数组 nums 和一个整数 x

请你找到数组中下标距离至少为 x 的两个元素的 差值绝对值最小值

换言之,请你找到两个下标 ij ,满足 abs(i - j) >= xabs(nums[i] - nums[j]) 的值最小。

请你返回一个整数,表示下标距离至少为 x 的两个元素之间的差值绝对值的 最小值

示例 1:

输入:nums = [4,3,2,4], x = 2
输出:0
解释:我们选择 nums[0] = 4 和 nums[3] = 4 。
它们下标距离满足至少为 2 ,差值绝对值为最小值 0 。
0 是最优解。

示例 2:

输入:nums = [5,3,2,10,15], x = 1
输出:1
解释:我们选择 nums[1] = 3 和 nums[2] = 2 。
它们下标距离满足至少为 1 ,差值绝对值为最小值 1 。
1 是最优解。

示例 3:

输入:nums = [1,2,3,4], x = 3
输出:3
解释:我们选择 nums[0] = 1 和 nums[3] = 4 。
它们下标距离满足至少为 3 ,差值绝对值为最小值 3 。
3 是最优解。

提示:

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^9
  • 0 <= x < nums.length

本题用java解法通过,但是cpp同样的写法,不知道为啥超时了。

思路是维护前面0i是个有序的序列,这样就可以用二分查找0i中和j最接近的元素

但是java中没有既可以自动排序,又可以用下标取的数据类型。所以就自己用二分维护了一个有序列表,就是每次来一个新元素i,用二分查找它应该放在哪个位置。有序序列就是 0 ~ i 中元素排序之后的结果。

class Solution {public int minAbsoluteDifference(List<Integer> nums, int x) {int n = nums.size(), ans = Integer.MAX_VALUE;List<Integer> ls = new ArrayList();         // 维护前面元素的有序序列(升序)for (int i = 0, j = x; j < n; ++i, ++j) {// 将nums[i]加入有序序列ls,使用二分查找寻找nums[i]应该插入的位置。int l = 0, r = ls.size(), v = nums.get(i);while (l < r) {int mid = l + r >> 1;if (ls.get(mid) <= v) l = mid + 1;else r = mid;}ls.add(l, v);// 使用二分查找寻找前面序列中最后一个<=nums[j]的元素l = 0;r = ls.size() - 1;v = nums.get(j);while (l < r) {int mid = l + r + 1 >> 1;if (ls.get(mid) > v) r = mid - 1;else l = mid;}// 使用和nums[j]最接近的元素更新答案ans = Math.min(ans, Math.abs(v - ls.get(l)));if (l + 1 < ls.size()) ans = Math.min(ans, Math.abs(ls.get(l + 1) - v));}return ans;}
}

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

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

相关文章

20230901工作心得:IDEA列操作lambda表达式加强版用法

今天是中小学开学时间&#xff0c;亦是9月的开始&#xff0c;继续努力。 今日收获较大的有四个地方&#xff0c;先说这四点。 1、IDEA列操作 使用场景&#xff1a;需要批量将Excel表格里的数据插入到数据库中&#xff0c;此时需要写大量的insert SQL语句。 比如像这样的&am…

RunnerGo:轻量级、全栈式、易用性和高效性的测试工具

随着软件测试的重要性日益凸显&#xff0c;市场上的测试工具也日益丰富。RunnerGo作为一款基于Go语言研发的开源测试平台&#xff0c;以其轻量级、全栈式、易用性和高效性的特点&#xff0c;在测试工具市场中逐渐脱颖而出。 RunnerGo是一款轻量级的测试工具&#xff0c;使用Go…

python爬虫数据解析xpath

一、环境配置 1、安装xpath 下载地址&#xff1a;百度网盘 请输入提取码 第一步&#xff1a; 下载好文件后会得到一个没有扩展名的文件&#xff0c;重命名该文件将其改为.rar或者.zip等压缩文件&#xff0c;解压之后会得到一个.crx文件和一个.pem文件。新建一个文件夹&…

《论文阅读21》Equivariant Multi-View Networks

一、论文 研究领域&#xff1a;计算机视觉 | 多视角数据处理中实现等变性论文&#xff1a;Equivariant Multi-View Networks ICCV 2019 论文链接视频链接 二、论文简述 在计算机视觉中&#xff0c;模型在不同视角下对数据&#xff08;例如&#xff0c;点云、图像等&#xff0…

【python爬虫】—豆瓣电影Top250

豆瓣电影Top250 豆瓣榜单简介需求描述Python实现 豆瓣榜单简介 豆瓣电影 Top 250 榜单是豆瓣网站上列出的评分最高、受观众喜爱的电影作品。这个榜单包含了一系列优秀的影片&#xff0c;涵盖了各种类型、不同国家和时期的电影。 需求描述 使用python爬取top250电影&#xff…

AMEYA360代理 | 佰维eMMC、LPDDR存储芯片赋能电视终端流畅体验

5G、AI、VR、AR等技术的发展&#xff0c;助推智能电视、机顶盒等电视终端成为智能家居领域不可忽视的重要设备。随着4K超高清(UHD)技术、虚拟现实技术(VR)和增强现实技术(AR)的普及&#xff0c;并向8K超高清技术不断渗透&#xff0c;电视终端将可以为消费者提供更清晰的视觉体验…

vue通过draggable实现拖拽功能

1. 官方文档 2. 安装 yarn add vuedraggable npm i -S vuedraggable <script src"//cdnjs.cloudflare.com/ajax/libs/Vue.Draggable/2.20.0/vuedraggable.umd.min.js"></script> 3. 其他组件&#xff1a; sortablejs.js拖拽 非官网文档 npm install …

16 Linux之JavaEE定制篇-搭建JavaEE环境

16 Linux之JavaEE定制篇-搭建JavaEE环境 文章目录 16 Linux之JavaEE定制篇-搭建JavaEE环境16.1 概述16.2 安装JDK16.3 安装tomcat16.4 安装idea2020*16.5 安装mysql5.7 学习视频来自于B站【小白入门 通俗易懂】2021韩顺平 一周学会Linux。可能会用到的资料有如下所示&#xff0…

Windows右键添加用 VSCODE 打开

1.安装VSCODE时 安装时会有个选项来添加&#xff0c;如下&#xff1a; ①将“通过code 打开“操作添加到windows资源管理器文件上下文菜单 ②将“通过code 打开”操作添加到windows资源管理器目录上下文菜单 说明&#xff1a;①②勾选上&#xff0c;可以对文件&#xff0c;目…

C#,《小白学程序》第八课:列表(List)应用之二“编制高铁列车时刻表”

1 文本格式 /// <summary> /// 车站信息类 class /// </summary> public class Station { /// <summary> /// 编号 /// </summary> public int Id { get; set; } 0; /// <summary> /// 车站名 /// </summary&g…

Windows docker desktop 基于HyperV的镜像文件迁移到D盘

Docker desktop的HyperV镜像文件&#xff0c;默认是在C盘下 C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx如果部署的软件较多&#xff0c;文件较大&#xff0c;或者产生日志&#xff0c;甚至数据等&#xff0c;这将会使此文件越来越大&#xff0c;容易导致C盘空间…

java 浅谈ThreadLocal底层源码(通俗易懂)

目录 一、ThreadLocal类基本介绍 1.概述 : 2.作用及特定 : 二、ThreadLocal类源码解读 1.代码准备 : 1.1 图示 1.2 数据对象 1.3 测试类 1.4 运行测试 2.源码分析 : 2.1 set方法解读 2.2 get方法解读 一、ThreadLocal类基本介绍 1.概述 : (1) ThreadLocal&#xff0c;本…

python3.11教程1:python基础语法、程序控制、函数

文章目录 一、Python简介1.1 为什么学习python1.2 python安装与配置1.3 python解释器1.4 命令行参数1.4.1 sys.argv变量1.4.2 -c和-m选项 1.5 解释器的运行环境1.5.1 编码格式1.5.2 编码声明 二、Python基础语法2.1 行结构2.2 变量&#xff08;标识符&#xff09;2.3 字节串2.4…

神经网络NLP基础 循环神经网络 LSTM

用的时候&#xff0c;只关心token的输入&#xff0c;以及hidden state就好了 sequence的length是多少&#xff0c;lstm的cell的数量就是多少 LSTM BI-LSTM stacked lstm GRU 实现

【计算机网络】TCP 的三次握手和四次挥手

TCP 是面向连接的&#xff0c;面向连接就是数据通讯的时候需要进行三次握手&#xff0c;断开通讯的时候需要进行四次挥手。 1.seq(sequence number)&#xff0c;序列号&#xff0c;随机生成的 2.ack(acknowledgement number)&#xff0c;确认号&#xff0c;ackseq1 3.ACK(ackno…

Linux安装JenkinsCLI

项目简介安装目录 mkdir -p /opt/jenkinscli && cd /opt/jenkinscli JenkinsCLI下载 wget http://<your-jenkins-server>/jnlpJars/jenkins-cli.jar # <your-jenkins-server> 替换为你的 Jenkins 服务器地址 JenkinsCLI授权 Dashboard-->Configure Glob…

希尔贝壳入选“北京市人工智能大模型高质量数据集发布(第二批)”合作企业

8月28日&#xff0c;2023中国国际服务贸易交易会通用人工智能算力论坛在石景山区举办。论坛上&#xff0c;北京市人工智能大模型高质量数据集&#xff08;第二批&#xff09;发布&#xff0c;其中包含北京希尔贝壳科技有限公司的“大模型方言口语语音数据集”和“智能会议场景高…

评估安全 Wi-Fi 接入:Cisco ISE、Aruba、Portnox 和 Foxpass

在当今不断变化的数字环境中&#xff0c;对 Wi-Fi 网络进行强大访问控制的需求从未像现在这样重要。各组织一直在寻找能够为其用户提供无缝而安全的体验的解决方案。 在本博客中&#xff0c;我们将深入探讨保护 Wi-Fi&#xff08;和有线&#xff09;网络的四种领先解决方案——…

Show that f(z)=1/z is analytic or not

See https://brainly.in/question/21838444

HVV行动之态势感知平台(一)

知攻善防&#xff0c;遇强则强&#xff01; 先介绍一下什么是HVV行动&#xff1a; 它是由公安部牵头的&#xff0c;通过组织红队和蓝队进行为期两周到三周的攻防对抗演习&#xff0c;来检测一些企业单位可能存在的网络漏洞和威胁&#xff0c;进而进行修复和加固&#xff0c;提…