兩數之和,一般是隻有一組解。
方法一:暴力循環;
方法二:假設有多組解,把所有結果放到數組中,然後找距離最近的。
方法三:一個循環構建哈希表,一個循環查找結果;
方法四:一個循環,同事構建哈希表和查找結果;
/*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]’