最接近的三数之和
采用排序加双指针解法:
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var threeSumClosest = function(nums, target) {
nums = nums.sort((a,b)=>{
return a-b;
})
let resultSum = 1000000;
for(let i=0;i<nums.length;i++){
if(i >0 && nums[i]===nums[i-1]){
continue;
}
let j = i+1;
let k = nums.length-1;
while(j<k){
let sum = nums[i]+nums[j]+nums[k];
if(sum===target){
return sum;
}
if(Math.abs(sum-target)<Math.abs(resultSum-target)){
resultSum = sum;
}
if(sum-target>=0){
let k0 = k-1;
while(k0>j && nums[k0]===nums[k0+1]) {
k0--;
}
k = k0;
}
if(sum-target<0){
let j0 = j+1;
while(j0<k && nums[j0]===nums[j0-1]){
j0++;
}
j= j0;
}
}
}
return resultSum;
};
判断数组是否有重复数字
这是最开始想到的算法,也可以使用排序,然后循环一次进行两个数字比较
var containsDuplicate = function(nums) {
if([...new Set(nums)].length != nums.length){
return true;
} else {
return false;
}
};
使用排序再比较,然后循环可以用哈希表进行一次循环即可
var containsDuplicate = function(nums) {
let obj = {};
for(let i=0;i<nums.length;i++){
if(obj[nums[i]]) {
return true;
} else {
obj[nums[i]] = true;
}
}
return false;
};
相对名次
最开始使用的是:
var findRelativeRanks = function(score) {
const ward = ["Gold Medal","Silver Medal","Bronze Medal"]
const score2= JSON.parse(JSON.stringify(score)).sort((a,b)=>b-a);
const obj = {};
const result = [];
for(let i=0;i<score2.length;i++){
obj[score2[i]] = i+1;
}
for(let j=0;j<score.length;j++){
const val = obj[score[j]]
if(val<4) {
result.push(ward[val-1]);
} else {
result.push(val.toString())
}
}
return result;
};
可以直接用数组下标也可以,也是一遍循环,但是可能开辟的数组空间会比较大,代码如下:
var findRelativeRanks = function(score) {
const temp = [];
for (let i = 0; i < score.length; i++) {
temp[score[i]] = i;
}
console.log(temp)
let num = 1;
const result = [];
for (let j = temp.length - 1; j >= 0; j--) {
if (temp[j] != undefined) {
if (num<=3) {
console.log(num)
console.log(temp[j])
console.log( ['Gold Medal', 'Silver Medal', 'Bronze Medal'][num - 1])
result[temp[j]] = ['Gold Medal', 'Silver Medal', 'Bronze Medal'][num - 1]
} else {
result[temp[j]] = num + '';
}
num++;
}
}
return result;
};