**
关于数组遍历求和的三道编程题
**
题目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]
以上三道题都是相似的,那么,重点是复习有关数组和集合的相关知识点。!!!
后续,待更新…