题目难度:简单
1、两数之和给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解题思路
首先想到的是方案1用两次循环,但是这样当传入的数组很大时,效率会很低。
其次方案2使用的是es6提供的Map对象
最后方案3是使用很巧妙地差值存到对象中,效率非常高
方案1
执行用时:120 ms
内存消耗:34.7 MB
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
for(var i = 0; nums.length>i; i++){
for(var j = i+1; nums.length>j; j++){
if(nums[i]+nums[j]===target){
return [i, j]
}
}
}
};
twoSum([2, 7, 11, 15], 22);
方案2执行用时:64 ms
内存消耗:35.1 MB
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
const diffs = new Map();
const j = nums.findIndex((a, i) => diffs.has(target - a) || diffs.set(a, i) && 0);
return [diffs.get(target - nums[j]), j];
};
twoSum([2, 7, 11, 15], 22);
方案3(推荐)
执行用时:64 ms
内存消耗:34.3 MB
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
var numObj = {};
for(var i = 0; nums.length > i; i++){
var n = target - nums[i];
if(numObj[n]!==undefined){
return [numObj[n], i]
}
numObj[nums[i]] = i;
}
return [];
};
twoSum([2, 7, 11, 15], 22);
2、整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123 输出: 321
示例 2:
输入: -123 输出: -321
示例 3:
输入: 120 输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解题思路
第一种思路用字符串和数组内置的方法实现调转问题,最后根据正负返回结果
第二种使用数学方法实现高效率的数字翻转,~~是强制转换为数字,负数向上取整,正数像下取正
方案1
执行用时:96 ms
内存消耗:36 MB
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
if(x===0)return x;
let isMinus = x>0?true:false;
let value = (x+'').split('').reverse().join('');
let result = isMinus?parseInt(value):-parseInt(value);
let maxValue = Math.pow(2, 31);
let minValue = -maxValue;
if(minValue <= result && result <= maxValue-1){
return result;
}
return 0;
};
方案2(推荐)
执行用时:88 ms
内存消耗:35.6 MB
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let maxValue = Math.pow(2, 31);
let result = 0;
while(x !== 0) {
result = result*10 + x%10;
x = ~~(x/10);
}
return (result <= maxValue-1 && result >= -1*maxValue)?result:0;
};
注意:
1、解决问题的方法远远不止这几种,若有更新奇、简洁或效率的方法欢迎留言讨论。
2、leetcode 的执行用时和内存消耗个人觉得不准,受影响因素较多,不作为唯一参考因素
题目来源:
力扣(LeetCode)
链接:https://leetcode-cn.com

发表评论: