当前位置: 首页 > news >正文

【LeetCode】两数之和返回两数下标、数组形式整数相加

主页:HABUO🍁主页:HABUO


1.两数之和返回两数下标

题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

  • 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
  • 你可以按任意顺序返回答案。

示例:

输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

输入:nums = [3,2,4], target = 6 输出:[1,2]

输入:nums = [3,3], target = 6 输出:[0,1]

分析:以我们现在的知识水平,最容易想到的就是暴力枚举,因为我们之前写过冒泡排序,类比思想,固定一个数据不动遍历其它数据,如果和等于target返回这两个数据的下标,如果遍历完了,还没有那么,固定的那个数据+1,从而固定下一个数据,再进行遍历,这我们就能感受到,这个时间复杂度是不是O(N^2),不太好,但知识水平有限,我们先这样做,随着学习的深入,之后我们再以优越的方法解决此题。整体思路见下图:

int* twoSum(int* nums, int numsSize, int target, int* returnSize) 
{int rest = 0;for(rest = 0; rest < numsSize;rest++){//for(int move = rest + 1 ; move < numsSize; move++){if(nums[rest]+nums[move] == target){int* sz = (int*)malloc(2*sizeof(int));sz[0] = rest;sz[1] = move;*returnSize = 2;return sz;}   }}return NULL;
}

需要注意的是,题目中要求是返回两个数据的下标,我们都知道return只能返回一个值,那怎么办?很容易想到以一个数组去返回,函数中有一个参数是 int* returnSize,这个叫做输出型参数,什么意思呢?你看我们既然开辟了一个数组,函数外需要访问,但是不知道数组大小,难道一直访问下去吗?这肯定会导致越界,因此我们需要告诉函数外这个数组的大小是什么,returnSize就是完成这个事,你看它传的是地址,解引用就可以对外部这个数值进行修改,因此我们通过此来返回数组的大小

2.大数相加(数组形式整数相加)

题目:整数的 数组形式  num 是按照从左到右的顺序表示其数字的数组。

  • 例如,对于 num = 1321 ,数组形式是 [1,3,2,1] 。
  • 给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k 的 数组形式 。

示例:

输入:num = [1,2,0,0], k = 34    输出:[1,2,3,4]      解释:1200 + 34 = 1234

输入:num = [2,7,4], k = 181     输出:[4,5,5]         解释:274 + 181 = 455

输入:num = [2,1,5], k = 806     输出:[1,0,2,1]      解释:215 + 806 = 1021

分析:

首先我们应该想一下为什么会有这样的一种题,背景是什么?无论我们的int  unsigned int 就是long long 它们所能存储的数据是不是有限,那像我们导弹、航空航天的一些数据它可能相当巨大,这样的一个类型是不是不能存,所以有了数组存大数的这样一种形式。但万变不离其宗,你要计算数据,是不是要拿到每一位的数,对应位进行相加,这就是总的思想。所以每步分析见下:

第一步:题中要求返回的数据以数组形式,那我们首先要知道这个数组要设置多大吧,所以,我们先来分析这个结果数组,我们都知道3位数与3位数相加你最大也就是4位数,因此呢最终结果数组就是两组数中最大的数再多一位,所以我们应该要知道哪组数最大。

    //求k的位数int Ksize = 0;int Knum = k;while(knum){Ksize++;Knum /= 10;}//求两组数位数最大int len =(numSize > Ksize ? numSize : Ksize);//建立结果数组int* retArr = (int*)malloc(sizeof(int) * (len + 1));

第二步:是不是就是进入一个循环,拿到两组数的每一位,然后相加,但这里需要考虑一些细节,我们算加法时,都是从最低位开始算起,再一个,需要考虑进位的问题,还有得到的结果怎么放到数组的一个问题,如果我们从后往前方这就存在假设最终没有进位,那我们是按照最大的再加一位进行建立的数组,那数组第一位是就空着了,当然用之前我们所学的顺序表的一些知识,可以往前挪,这就麻烦了,我们可以正着放,最终逆置一下就可以达到我们所想要的目的了。 整体思路见下图:

这里相应的产出一个问题,这是数组大,k数值小,那如果是k大,数组小呢?!是不是极有可能造成越界访问,因此需要解决这样的问题的话,进行如下操作,如果Ni还有值,我们就让n=num[Ni],如果没有值了,自然也不会进入到if语句当中,我们直接对n定义为0即可。

int n = 0;
if (Ni >= 0)
{n = num[Ni];
}

进位的问题,我们用一个next值进行保存即可, 有进位就让next置1,没有进位就让它置0,需要注意没有进位的时候要主动置0,防止因为上一位的计算所保留的进位,影响到该位的计算。具体思想见下:

int ret = n + k % 10 + next;
if (ret > 9)
{next = 1;retArr[Ai] = ret - 10;Ai++;
}
else
{next = 0;retArr[Ai] = ret;Ai++;
}

当计算走到最后的时候,又会出现一个问题,即len已经减到0了,但是我们如果还有一位进位,那么循环进入不进去,那这个进位就不会放到数组当中,就会导致丢失一个最高位1的 情况,怎么解决呢?思想就是在最后一步如果产生进位,主动的把进位补上即可,思想见下:

if (len == 0 && ret > 9)
{retArr[Ai] = next;retSize = retSize + 1;
}

所以计算部分整体思路见下:

int Ni = numSize - 1;
int Ai = 0;
int next = 0;
while (len--)
{//处理k大数组小,导致数组越界访问的情况int n = 0;if (Ni >= 0){n = num[Ni];}int ret = n + k % 10 + next;Ni--;k /= 10;if (ret > 9){next = 1;retArr[Ai] = ret - 10;Ai++;}else{next = 0;retArr[Ai] = ret;Ai++;}//处理最后一步有进位的情况if (len == 0 && ret > 9){retArr[Ai] = next;retSize = retSize + 1;}
}

前面提到我们在建立新的数组中放置数据是正着放的,这不是我们所想要的计算结果,我们需要对数组进行逆置,逆置就相对比较简单,只需要建立left,right两个标记进行来回赋值即可

//逆置结果数组
int left = 0;
int right = retSize - 1;
while (left < right)
{int temp = retArr[left];retArr[left] = retArr[right];retArr[right] = temp;left++;right--;
}

总代码见下:

int* addToArrayForm(int* num, int numSize, int k, int* returnSize) {//求k的位数int Ksize = 0;int Knum = k;while (Knum){Ksize++;Knum /= 10;}//求两组数位数最大int len = (numSize > Ksize ? numSize : Ksize);//建立结果数组int* retArr = (int*)malloc(sizeof(int) * (len + 1));int retSize = len;//结果数组大小//计算过程int Ni = numSize - 1;int Ai = 0;int next = 0;while (len--){//处理k大数组小,导致数组越界访问的情况int n = 0;if (Ni >= 0){n = num[Ni];}int ret = n + k % 10 + next;Ni--;k /= 10;if (ret > 9){next = 1;retArr[Ai] = ret - 10;Ai++;}else{next = 0;retArr[Ai] = ret;Ai++;}//处理最后一步有进位的情况if (len == 0 && ret > 9){retArr[Ai] = next;retSize = retSize + 1;}}//逆置结果数组int left = 0;int right = retSize - 1;while (left < right){int temp = retArr[left];retArr[left] = retArr[right];retArr[right] = temp;left++;right--;}*returnSize = retSize;//返回数组大小return retArr;//返回数组
}

相关文章:

【LeetCode】两数之和返回两数下标、数组形式整数相加

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO 1.两数之和返回两数下标 题目&#xff1a;给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输…...

Kubernetes中的secrets存储

华子目录 2.secrets2.1secrets功能介绍2.2secrets的创建2.2.1从文件创建2.2.2编写yaml文件 2.3secret的使用案例2.3.1将secret挂载到volume中2.3.2设置子目录映射secret密钥2.3.3将secret设置为环境变量2.3.4存储docker register的认证信息spec.imagePullSecrets[] 2.secrets …...

使用 Elastic、OpenLLMetry 和 OpenTelemetry 跟踪 LangChain 应用程序

作者&#xff1a;来自 Elastic Bahubali Shetti Langchain 应用程序的使用正在增长。构建基于 RAG 的应用程序、简单的 AI 助手等的能力正在成为常态。观察这些应用程序更加困难。考虑到现有的各种选项&#xff0c;本博客展示了如何将 OpenTelemetry 检测与 OpenLLMetry 结合使…...

【论文复现】VALL-E:语音合成的新里程

&#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐、摄影的一位博主。 &#x1f4d7;本文收录于论文复现系列&#xff0c;大家有兴趣的可以看一看。 &#x1f4d8;相关专栏C语言初阶、…...

java项目之微服务在线教育系统设计与实现(springcloud)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 微服务在线教育系统设计与…...

P3-1.【结构化程序设计】第一节——知识要点:算法、顺序结构程序设计、if语句的语法结构及各种用法

讲解视频&#xff1a; P3-1.【结构化程序设计】第一节——知识要点&#xff1a;算法、顺序结构程序设计、if语句的语法结构及各种用法 知识要点&#xff1a;算法、顺序结构程序设计、if语句的语法结构及各种用法 一、算法、顺序结构程序设计任务分析 知识要点&#xff1a;算法…...

Vue2——单页应用程序路由的使用

一.单页应用程序与多页应用程序之间的比较 二.单页的应用场景 系统类网站 / 内部网站 / 文档类网站 / 移动端网站 三.路由的介绍 1. 什么是路由 路由是一种映射关系 2. Vue中的路由是什么 路径和组件的映射关系 四.VueRouter的使用 5个基础步骤&#xff08;固定&#xff09; …...

变分法(Calculus of Variations)

变分法&#xff08;Calculus of Variations&#xff09;是数学的一个分支&#xff0c;主要研究函数的极值问题&#xff0c;即寻找一个函数&#xff0c;使得某个泛函达到最大值或最小值。泛函是将函数作为变量的函数&#xff0c;与通常的函数不同&#xff0c;泛函的变量是函数本…...

包括 Nginx、Gateway、Nacos、Dubbo、Sentinel、RocketMQ 和 Seata 的调用链路描述:

以下是一个更详细和清晰的客户端请求在 Spring Cloud Alibaba 框架中&#xff0c;包括 Nginx、Gateway、Nacos、Dubbo、Sentinel、RocketMQ 和 Seata 的调用链路描述&#xff1a; 1. 客户端请求 用户在浏览器或移动应用中发起请求&#xff08;例如&#xff0c;获取用户信息的…...

【P2-1】ESP8266 WIFI模块STA、AP、STA+AP、TCP/UDP透传工作模式介绍与AT指令介绍

前言:本文对ESP8266 WIFI模块STA、AP、STA+AP、TCP/UDP透传工作模式进行介绍;以及AT指令介绍,包括基础AT指令,WIFI功能AT指令、TCP/IP相关AT指令、常用AT指令实例进行介绍。 ESP8266 WIFI模块的接线及固件烧写可参考我的这篇博客:正点原子ATK-ESP8266 WIFI模块接线及固件…...

《C#语法一篇通》,20万字,48小时阅读,持续完善中。。。

本文摘录了C#语法的主要内容&#xff0c;接近20万字。 所有鸡汤的味道都等于马尿&#xff01; 如果你相信任何所谓的鸡汤文章&#xff0c;智商堪忧。 计算机语言没有”好不好“之说&#xff0c;骗子才会告诉你哪个语言好&#xff0c;学好任何一本基础语言&#xff08;C&#…...

[node] 2 fs文件系统模块

前言 fs模块是Node.js官方提供的内置Api,用来操作文件的模块。它提供了一系列的属性和方法,来满足用户对文件的操作需求 目标 1 掌握fs中文件处理方法readFile、writeFile等的基础用法 2 node如何安装 3 一些常用的终端快捷键 #mermaid-svg-rPp2nDYrW33gLvuI {font-family:&q…...

【react】基础知识点学习

1. 创建项目 npm install -g create-react-app npx create-react-app my-app cd my-app npm startindex.js为入口文件&#xff0c;App.js为根组件。 如何将react应用挂载在页面上&#xff1f; 将App组件渲染到id为root的DOM元素中 2. JSX JSX是|avaScript和XML(HTML)的缩写…...

D4--哈夫曼树和不等式

看文先三连&#xff0c;养成好习惯~看文先三连&#xff0c;养成好习惯~看文先三连&#xff0c;养成好习惯~ 目录 知识点&#xff1a; 堆排序&#xff1a; 优先队列&#xff1a; 定义&#xff1a;&#xff08;默认大顶堆&#xff09; 入队: 出队&#xff1a; 取队顶&…...

详解RabbitMQ三种队列类型

RabbitMQ 是一个强大的消息队列系统&#xff0c;它提供了多种队列类型以满足不同的使用需求。本文将探讨三种主要队列类型&#xff1a;经典队列、仲裁队列和流式队列&#xff0c;并讨论它们的区别和选型建议。 经典队列&#xff08;Classic Queues&#xff09; 简介&#xff…...

openGauss数据库-头歌实验1-3 创建和管理模式

一、创建和使用模式 &#xff08;一&#xff09;任务描述 本关任务&#xff1a;基于 openGauss 学习创建模式的相关知识。 &#xff08;二&#xff09;相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.openGauss 的常用操作&#xff0c;2.SQL 创建模式相关语…...

森林火灾检测数据集(猫脸码客 第233期)

森林火灾检测数据集 森林火灾是一种具有巨大破坏性的自然灾害&#xff0c;每年在全球范围内造成巨大损失。为了有效应对森林火灾&#xff0c;及早发现和快速响应是至关重要的。传统上&#xff0c;森林火灾的检测主要依赖于人工巡逻和卫星遥感技术。然而&#xff0c;这些方法存…...

LeetCode100之找到字符串中所有字母异位词(438)--Java

1.问题描述 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 示例1 输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 …...

【Python】Python自习课:第一个python程序

【Python】Python自习课&#xff1a;第一个python程序...

DICOM标准:解析DICOM属性中的病人模块

目录 病人模块概述 1. 病人关系模块&#xff08;Patient Relationship Module&#xff09; 2. 病人识别模块&#xff08;Patient Identification Module&#xff09; 3. 病人统计模块&#xff08;Patient Demographic Module&#xff09; 4. 病人医学模块&#xff08;Pati…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...