和为s的两个数字VS和为s的连续正数序列(Java)

2024-08-29 13:58

本文主要是介绍和为s的两个数字VS和为s的连续正数序列(Java),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

输入一个递增排序的数组和一个数字s,在数组在查找两个数,使得它们的和正好是。如果有多对数字的和等于s,输出任意一对即可。

例如:输入数组{1、2、4、7、11、15}和数字15。由于4 + 11 = 15,因此输出4 和 11。

思路:

直观的思路:遍历数组两遍,即每一个数字和后面的数字相加看是否等于15,是直接返回,否则继续遍历直到找到或者遍历结束为止。时间复杂度O(n^2)。

最优解思路:定义两个指针p1和p2,p1指向1,p2指向15。p1 + p2 大于15,p2指针移动,p1 + p2 小于15,p1指针移动,直到p1 + p2 = 15,返回p1和p2。

代码实现:

public static ArrayList<Integer> findNumbersWithSum(int data[], int sum){ArrayList<Integer> list = new ArrayList<Integer>();if(data == null || data.length < 2){return list;}int p1 = 0; //指向数组首元素int p2 = data.length - 1; //指向数组末尾元素while(p2 > p1){if(data[p1] + data[p2] == sum){list.add(p1);list.add(p2);}else if(data[p1] + data[p2] > sum){p2--;}else{p1++;}}return list;
}

拓展题目:

输入一个整数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1 + 2 + 3 + 4 + 5 = 4 + 5 + 6 = 7 + 8 =15,所以结果打印出3个连续序列1~5,4~6和7~8。

思路:

定义两个指针p1和p2分别指向数组的第一个位置和数组的第二个位置,求序列的和,如果小于s,p2向后移动,继续就和,如果满足,打印当前p1和p2指向的序列片段,p2继续移动,此时序列的和会大于s,p1向前移动,判断序列和是否为s,如果小于s,p2向后移动,继续上面的判断,否则如果大于s,p1向前移动,在判断和,如果大于或者等于,或者小于,分别做对应的处理。等于的话:输出序列片段,p2向后移动;小于的话p2直接向后移动,再做判断;大于的话p1向后移动,再做判断。

代码实现:

public static ArrayList<ArrayList<Integer>> finfContinuousSequence(int sum){ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();if(sum < 3){ //因为至少含有两个数,故1+2=3,故sum > 3return list;}ArrayList<Integer> l = new ArrayList<Integer>();int small = 1;int big = 2;int middle = (1 + sum) / 2; //因为至少连续2个且顺序增加,所以取中间值int curSum = small + big;while(small < middle){if(curSum == sum){for(int i = small; i <= big; i++){l.add(i);}list.add(l);}while(curSum > sum && small < middle){curSum -= small;small++;if(curSum == sum){for(int i = small; i <= big; i++){l.add(i);}list.add(l);}}big++;curSum += big;}return list;
}

 

这篇关于和为s的两个数字VS和为s的连续正数序列(Java)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118059

相关文章

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

javacv依赖太大导致jar包也大的解决办法

《javacv依赖太大导致jar包也大的解决办法》随着项目的复杂度和依赖关系的增加,打包后的JAR包可能会变得很大,:本文主要介绍javacv依赖太大导致jar包也大的解决办法,文中通过代码介绍的... 目录前言1.检查依赖2.更改依赖3.检查副依赖总结 前言最近在写项目时,用到了Javacv里的获取视频

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H