两数之和,一般是只有一组解。
方法一:暴力循环;
方法二:假设有多组解,把所有结果放到数组中,然后找距离最近的。
方法三:一个循环构建哈希表,一个循环查找结果;
方法四:一个循环,同事构建哈希表和查找结果;
/*1.假设数组中只有唯一的解,并且要求不能是重复的坐标*/
var testNum1=[34,4,6,9,3,0];
var twoSum1=function (nums,target) {
var result=[];
for(var i=0;i<nums.length;i++){
for(var j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target){
result.push(i);
result.push(j);
}
}
}
return (result.length!==0? result:null);
};
/*2.输入数组里面有多种这样的值*/
var testNum2=[1,2,3,4,5,6,7,8];
var twoSum2=function (nums,target) {
var result=[];
var temp=[];
for(var i=0;i<nums.length-1;i++){
for(var j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target){
temp.push(i);
temp.push(j);
result.push(temp);
temp=[];
}
}
}
/*返回距离最小的那一组*/
if(result.length==0){
return null;}else{
var min=result[0][1]-result[0][0];
var finalReault=result[0];
for(var i=0;i<result.length;i++){
var distance=result[i][1]-result[i][0];
if(distance<min){
min=distance;
finalReault=result[i];
}
}
}
return finalReault;
};
/*3.构造一个哈希表,然后用target-值,判断剩余的值是否在在哈希表中*/
var twoSum3=function(nums,target){
if(!Array.isArray(nums)|| Object.prototype.toString.call(target)!=='[object Number]'){return 'type error'};
var i,j,len=nums.length,arr=[];
for(i=0;i<len;i++){
arr[nums[i]]=i;
}
for(j=0;j<len;j++){
if(arr[target-nums[j]]!==undefined && arr[target-nums[j]]!==j ) {
return [j,arr[target-nums[j]]];
}else{
return -1;
}
}
}
/*4.对3的改进,使用一个循环,在循环中边寻找结果,边构建哈希表*/
var twoSum4=function(nums,target){
if(!Array.isArray(nums)||Object.prototype.toString.call(target)!=='[object Number]') return 'type error';
var arr=[],i,j,len=nums.length;
for(i=0;i<len;i++){
j=arr[target-nums[i]];
if(j!==undefined){return [i,j]};
arr[nums[i]]=i;
}
}
console.log(twoSum4(testNum1,7));
console.log(Object.prototype.toString.call(6)=='[object Number]');
注意点:①判断是否是数组;
②判断是否是Number类型
(typeof 7)==Number) //会返回false
//用内置对象,该方法也可以判断是不是数组
Object.prototype.toString.call(变量)==‘[object Number]’