数组遍历求和的三道编程题

**

关于数组遍历求和的三道编程题

**

题目1:给定一个已按照升序排列的整数数组numbers,请你从数组中找出两个数满足相加之和等于目标数target。
注:numbers的下标从1开始,所以答案数组应当满足1<=answer[0]<answer[1]<=numbers.length,每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

读完此题,想到了有关于双指针的相关知识,利用双指针求解,其中,定义两个指针,左指针指向最小值,右指针指向最大值。
开始代码的编写,哈哈哈哈。

var twoSum=function(numbers,target){
//使用双指针,根据题意此整数数组为升序,所以当两数之和大于目标值target时,移动右指针,当两数之和小于目标值target时,移动左指针。
//定义一个空的数组,用于存放指定元素的下标
	var arr=[];
	//定义左右指针
	var l=0;
	var r=numbers.length-1;
	//开始循环遍历
	while(l<r){
		if(numbers[l]+numbers[r]===target){
			arr[0]=l+1;
			arr[1]=r+1;
		}else if(numbers[l]+numbers[r]<target){
			l++;
		}else
		{
			r--;
		};
	
	};
return arr;
};
//所有结果均符合,只列出一种结果
//输入numbers=[2,7,11,15],target=9
//输出结果为[1,2]

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

最简单的方法就是暴力使用far循环,固定一个数,比较另一个数,相加的和是否等于目标值target

var twoSum=function(nums,target){
	//定义一个空的数组,用于存放索引值
	var arr=[];
	//对nums循环遍历
	//这里使用双重循环
	for(var i=0;i<nums.length;i++){
		for(var j=i+1;j<nums.length;j++){
			if(nums[i]+nums[j]===target){
				arr[0]=i;
				arr[1]=j;
			};
		};
	};
	return arr;
	
};
//所有结果均符合,只列出一种结果
//输入:nums=[3,3],target=6
//输出:[0,1]

题目3:输入一个递增的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
很明显,此题与上面两道题的区别在于输出的是满足题意的元素,而不是元素的下标。
我想到两种方法解决此问题,但是由于第一种运行时间超时,所以不推荐。
1 这种方法和第二题的思路一样,都是暴利双重for循环。

var twoSum=function(nums,target){
	//定义一个空的数组,用于存放索引值
	var arr=[];
	//对nums循环遍历
	//这里使用双重循环
	for(var i=0;i<nums.length;i++){
		for(var j=i+1;j<nums.length;j++){
			if(nums[i]+nums[j]===target){
				arr[0]=nums[i];
				arr[1]=nums[j];
			};
		};
	};
	return arr;
}

2 这里想到了集合

var twoSum=function(nums,target){
	//定义一个空的集合,用于存放数组的全部元素
	var set=new Set();
	//定义一个空的数组,用于存放索引值
	var arr=[];
	for(var num of nums){
		set.add(num);
	};
	//开始for循环
	for(var i=0,len=nums.length;i<len;i++){
		var x=target-nums[i];
		//判断x是否在集合中存在
		if(set.has(x)){
			arr[0]=nums[i];
			arr[1]=x;
		};
	};
	return arr;
};
//所有结果均符合,只列出一种结果
//nums:[2,7,11,15],target=9
//[2,7]或[7,2]

以上三道题都是相似的,那么,重点是复习有关数组和集合的相关知识点。!!!
后续,待更新…

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值