【限时免费】20天拿下华为OD笔试之【双指针】2023Q1A-两数之和绝对值最小【欧弟算法】全网注释最详细分类最全的华为OD真题题解
文章目录
- 题目描述与示例
- 题目描述
- 输入
- 输出
- 示例一
- 输入
- 输出
- 说明
- 解题思路
- 代码
- 解法一
- python
- java
- cpp
- 解法二
- python
- java
- cpp
- 时空复杂度
- 华为OD算法/大厂面试高频题算法练习冲刺训练
题目描述与示例
题目描述
给定一个整数数组nums,请你在该数组中找出两个数,使得这两个数的和的绝对值abs(nums[x] + nums[y])为最小值并按从小到大返回这两个数以及它们和的绝对值。每种输入只会对应一个答案。数组中同一个元素不能使用两遍。
输入
一个通过空格分割的整数序列字符串,最多1000个整数,且整数数值范围是[-65535,65535]
输出
两个数以及两数之和绝对值
示例一
输入
-1 -3 7 5 11 15
输出
-3 5 2
说明
因为abs(nums[0]+nums[2]) = abs(-3+5) = 2在所有数对中最小,所以返回-3 5 2
解题思路
注意,本题和LC167. 两数之和 II - 输入有序数组解题方法非常类似。但在判断指针移动的条件上,稍微有些不同。
要用上相向双指针,首先要对lst数组进行排序。
两个数的和的绝对值越小,说明这两个数的和越接近于0。所以这道题可以换一种问法,找到两个数使得它们的和尽可能地接近0。我们可以使用相向双指针left和right指向一小一大两个数,当
lst[left] + lst[right] > 0时,如果令left右移,两数和会进一步增大,距离0更远,因此需要令right左移。lst[left] + lst[right] < 0时,如果令right左移,两数和会进一步减小,距离0更远,因此需要令left右移。lst[left] + lst[right] == 0时,两数和的绝对值已经达到最小,可以直接退出循环。
另外,对于每对两数和sum2 = lst[left] + lst[right],我们都应该令其绝对值与之前的得到最小两数和绝对值进行比较并更新。上述思路整理为代码即:
while left < right:sum2 = lst[left] + lst[right]if abs(sum2) < ans[2]:ans = [lst[left], lst[right], abs(sum2)]if sum2 > 0:right -= 1elif sum2 < 0:left += 1else:break
如果没有想到上述方法,在选择left和right移动哪一个的问题上,我们也可以直接考虑移动后的结果。当
abs(lst[left+1] + lst[right]) < abs(lst[left] + lst[right-1]),即left右移后两数和的绝对值小于right左移的结果,那么我们令left右移。abs(lst[left+1] + lst[right]) >= abs(lst[left] + lst[right-1]),即left右移后两数和的绝对值大于等于right左移的结果,那么我们令right左移。
上述思路整理为代码即:
while left < right:if abs(lst[left] + lst[right]) < ans[2]:ans = [lst[left], lst[right], abs(sum2)]if abs(lst[left+1] + lst[right]) < abs(lst[left] + lst[right-1]):left += 1else:right -= 1
代码
解法一
将题目转化为考虑最接近target = 0的两数和
python
# 题目:2023Q1A-两数之和绝对值最小
# 分值:100
# 作者:许老师-闭着眼睛学数理化
# 算法:相向双指针
# 代码看不懂的地方,请直接在群上提问lst = list(map(int, input().split()))
lst.sort()
n = len(lst)# 答案变量ans为一个三元列表,分别为两个数以及两数和的绝对值
ans = [lst[0], lst[-1], abs(lst[0]+lst[-1])]left, right = 0, n-1while left < right:# 计算left和right所指两个元素的和sum2 = lst[left] + lst[right]# 如果两数和的绝对值小于之前记录的最小两数和的绝对值if abs(sum2) < ans[2]:# 更新答案变量ansans = [lst[left], lst[right], abs(sum2)]# 两数和大于0,right左移if sum2 > 0:right -= 1# 两数和小于0,left右移elif sum2 < 0:left += 1# 两数和等于0,退出循环else:break# 用map把ans中的所有int转为str,合并后输出
print(" ".join(map(str, ans)))
java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();List<Integer> lst = new ArrayList<>();while (input.contains(" ")) {int pos = input.indexOf(' ');lst.add(Integer.parseInt(input.substring(0, pos)));input = input.substring(pos + 1);}lst.add(Integer.parseInt(input));lst.sort(null);int n = lst.size();List<Integer> ans = Arrays.asList(lst.get(0), lst.get(n - 1), Math.abs(lst.get(0) + lst.get(n - 1)));int left = 0;int right = n - 1;while (left < right) {int sum2 = lst.get(left) + lst.get(right);if (Math.abs(sum2) < ans.get(2)) {ans = Arrays.asList(lst.get(left), lst.get(right), Math.abs(sum2));}if (sum2 > 0) {right--;} else if (sum2 < 0) {left++;} else {break;}}for (int num : ans) {System.out.print(num + " ");}System.out.println();}
}
cpp
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {vector<int> lst;string input;getline(cin, input);size_t pos = 0;while ((pos = input.find(' ')) != string::npos) {lst.push_back(stoi(input.substr(0, pos)));input.erase(0, pos + 1);}lst.push_back(stoi(input));sort(lst.begin(), lst.end());int n = lst.size();vector<int> ans = {lst[0], lst[n - 1], abs(lst[0] + lst[n - 1])};int left = 0;int right = n - 1;while (left < right) {int sum2 = lst[left] + lst[right];if (abs(sum2) < ans[2]) {ans = {lst[left], lst[right], abs(sum2)};}if (sum2 > 0) {right--;} else if (sum2 < 0) {left++;} else {break;}}for (int num : ans) {cout << num << " ";}cout << endl;return 0;
}
解法二
直接考虑移动哪一个指针,能使两数和的绝对值更小。
python
# 题目:2023Q1A-两数之和绝对值最小
# 分值:100
# 作者:许老师-闭着眼睛学数理化
# 算法:相向双指针
# 代码看不懂的地方,请直接在群上提问lst = list(map(int, input().split()))
lst.sort()
n = len(lst)# 答案变量ans为一个三元列表,分别为两个数以及两数和的绝对值
ans = [lst[0], lst[-1], abs(lst[0]+lst[-1])]left, right = 0, n-1while left < right:# 如果当前两数和绝对值小于当前记录的最小值,则更新答案if abs(lst[left] + lst[right]) < ans[2]:ans = [lst[left], lst[right], abs(sum2)]# left和right移动哪个能使得两数和绝对值更小,则移动哪一个if abs(lst[left+1] + lst[right]) < abs(lst[left] + lst[right-1]):left += 1else:right -= 1# 用map把ans中的所有int转为str,合并后输出
print(" ".join(map(str, ans)))
java
import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();String[] tokens = input.split("\\s+");int[] lst = new int[tokens.length];for (int i = 0; i < tokens.length; i++) {lst[i] = Integer.parseInt(tokens[i]);}Arrays.sort(lst);int n = lst.length;// 答案变量ans为一个三元数组,分别为两个数以及两数和的绝对值int[] ans = new int[]{lst[0], lst[n - 1], Math.abs(lst[0] + lst[n - 1])};int left = 0;int right = n - 1;while (left < right) {// 如果当前两数和绝对值小于当前记录的最小值,则更新答案if (Math.abs(lst[left] + lst[right]) < ans[2]) {ans = new int[]{lst[left], lst[right], Math.abs(lst[left] + lst[right])};}// left和right移动哪个能使得两数和绝对值更小,则移动哪一个if (Math.abs(lst[left + 1] + lst[right]) < Math.abs(lst[left] + lst[right - 1])) {left++;} else {right--;}}// 输出结果for (int num : ans) {System.out.print(num + " ");}}
}
cpp
#include <iostream>
#include <sstream>
#include <algorithm>
#include <vector>using namespace std;int main() {string input;getline(cin, input);stringstream ss(input);vector<int> lst;int num;while (ss >> num) {lst.push_back(num);}sort(lst.begin(), lst.end());int n = lst.size();vector<int> ans = {lst[0], lst[n - 1], abs(lst[0] + lst[n - 1])};int left = 0;int right = n - 1;while (left < right) {if (abs(lst[left] + lst[right]) < ans[2]) {ans = {lst[left], lst[right], abs(lst[left] + lst[right])};}if (abs(lst[left + 1] + lst[right]) < abs(lst[left] + lst[right - 1])) {left++;} else {right--;}}for (int num : ans) {cout << num << " ";}cout << endl;return 0;
}
时空复杂度
时间复杂度:O(NlogN)。主要为排序的时间复杂度。
空间复杂度:O(1)。忽略排序所需要的栈空间,仅需要用到若干常数变量。
华为OD算法/大厂面试高频题算法练习冲刺训练
-
华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!
-
课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化
-
每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!
-
60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁
-
可上全网独家的欧弟OJ系统练习华子OD、大厂真题
-
可查看链接 大厂真题汇总 & OD真题汇总(持续更新)
-
绿色聊天软件戳
od1336了解更多
相关文章:
【限时免费】20天拿下华为OD笔试之【双指针】2023Q1A-两数之和绝对值最小【欧弟算法】全网注释最详细分类最全的华为OD真题题解
文章目录 题目描述与示例题目描述输入输出示例一输入输出说明 解题思路代码解法一pythonjavacpp 解法二pythonjavacpp 时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 给定一个整数数组nums,请你在该数组中找出两个数,…...
expect脚本在自动化部署中的具体应用案例
#expect脚本在自动化部署中的具体应用 expect脚本是一个非常好的交互式应用脚本,在自动化部署中,可以使用这个脚本来实现全自动的自动化部署。下面是一些具体的应用案例。 场景一:自动安装mysql 可以使用expect脚本来实现mysql自动安装&…...
【Java+SQL Server】前后端连接小白教程
目录 📋 流程总览 ⛳️【SQL Server】数据库操作 1. 新建数据库text 2. 新建表 3. 编辑表 ⛳️【IntelliJ IDEA】操作 1. 导入jar包 2. 运行显示错误 📋 流程总览 ⛳️【SQL Server】数据库操作 打开SQL Server数据库-->sa登录-->新建数据库…...
Xilinx Zynq-7000系列FPGA多路视频处理:图像缩放+视频拼接显示,提供工程源码和技术支持
目录 1、前言免责声明 2、相关方案推荐FPGA图像处理方案FPGA图像缩放方案FPGA视频拼接叠加融合方案推荐 3、设计思路详解HLS 图像缩放介绍Video Mixer介绍 4、vivado工程介绍PL 端 FPGA 逻辑设计PS 端 SDK 软件设计 5、工程移植说明vivado版本不一致处理FPGA型号不一致处理其他…...
Web语言基础课程期末代做
《Web语言基础》课程期末考核要求综合运用课程所学知识,使用VS和SQL及相关开发工具,结合DIVCSS等前端设计技术,完成一个具备新闻发布和考试功能的动态系统,要求包括但不限于:用户注册、登录功能、新闻展示功能、后台数…...
Scanner常用知识点
在Java中,Scanner类是用于读取用户输入的工具类,可以从多种输入源读取数据,如标准输入流、文件或字符串。以下是一些Scanner类的常用知识点: Scanner的初始化:在使用Scanner类之前,需要先将其导入到你的Ja…...
uniapp页面使用多个echarts出现数据渲染错乱问题解决
首先,uniapp当中使用echarts是在通过使用renderjs的script模板的前提下实现的,在官方提供的案例当中,核心代码是这一部分: 但如果将其封装为组件,并在一个页面当中引用多次来生成多个charts图标,那么这个时…...
PHP连接数据库 错误抑制 三元运算符 学习资料
PHP连接数据库 PHP可以通过不同的扩展和库来连接各种类型的数据库。下面是一个使用MySQL数据库的连接示例: <?php $servername "localhost"; $username "your_username"; $password "your_password"; $dbname "your_d…...
5G智慧工地整体解决方案:文件全文115页,附下载
关键词:5G智慧工地,智慧工地建设方案,智慧工地管理平台系统,智慧工地建设调研报告,智慧工地云平台建设 一、5G智慧工地建设背景 5G智慧工地是利用5G技术、物联网、大数据、云计算、AI等信息技术,围绕“人…...
数据结构 / 内存的动态申请和释放
1.内存的动态申请 malloc malloc 的头文件: #include <stdlib.h>格式: void *malloc(size_t size);参数: size_t size: 申请堆区内存大小, 单位是字节;size_t: 是数据类型, 是 unsigned long的宏定义的别名;返回值: void *: 通用类型指针,使用时需要强转为具…...
Android手电筒、闪光灯、torch、flash
1. 仅开启手电筒 单纯的开启手电筒我们可以使用CameraManager的.setTorchMode()方法。 cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE)获取该相机特征是否可获取闪光灯。 CameraManager cameraManager (CameraManager) getSystemService(CAMERA_SE…...
C语言--每日选择题--Day26
第一题 1.在C语言中,表示一次性地给数组a的10元素赋值() int a[10];scanf("%d",a); A:正确 B:错误 答案及解析 B 我们知道单独的数组名就是首元素地址,但是也有…...
[ACTF2020 新生赛]BackupFile
打开题目就一句话:尝试找到源文件 和上一题一样,用dirsearch扫描网站找到了一下内容 flag.php,0B,虚假flag 瞅一眼index.php.bak是啥 下载了一个文件,把bak后缀删掉,打开了index.php源码 is_numeric()&am…...
WPF面试题:WPF绘图技术介绍
作者:令狐掌门 技术交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目录 WPF绘图基本用法绘制直线在XAML中绘制直线在C#代码中绘制直线使用Path绘制直线注意矩形绘制在XAML中绘制矩形在C#代码中绘制矩形设置矩形的位置使用圆角矩形画刷1. SolidColor…...
三、Lua变量
文章目录 一、变量分类二、变量赋值三、索引 一、变量分类 lua变量分为全局变量,局部变量。 全局变量:默认,全局有效。 局部变量:从作用范围开始到作用范围结束,需加local 修饰。 a1function ff()local b1 endprint(a…...
C#每天复习一个重要小知识day4:枚举的概念/申明/使用
目录 1.枚举的概念: 2.申明枚举和申明枚举变量: 申明枚举语法: 申明枚举变量语法: 1.枚举的概念: 枚举是什么?枚举是一个比较特别的存在,它是一个命名的整形常量的集合,一般用它…...
C++:对象模型和this指针
对象模型: 成员变量和成员函数分开存储 在C中,类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 空对象占用空间: 1字节 C编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置 每个…...
碳酸氢锂/硫酸锂溶液纯化除钙镁解决方案
碳酸锂是锂电行业阳极生产中的一个重要原材料,主要用于制造钴酸锂、镍酸锂、锰酸锂等电极材料,也用于充电 锂电池中作非水溶液电解质等,具有良好的电化学性能,应用领域还在不断扩大。工业级碳酸锂主含量(Li2CO3&#x…...
消失的数字,旋转数组(leetcode 一题多解)
目录 一、消失的数字 思路一(暴力求解)代码实现: 思路二(数列的思想)代码实现: 思路三(异或的运用)代码实现: 二、轮转数组 思路一(暴力求解)…...
肠道菌群16s检测粪便采样工具包 粪便采样套装
肠道菌群16s检测是一种常见的分子生物学技术,用于研究人体肠道中的微生物群落。该技术通过分析16s rRNA基因序列,可以快速、准确地鉴定并定量不同种类的肠道微生物。 肠道菌群16s检测通常通过采集粪便样本进行分析。在实验室中,通过提取微生物…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
