题目1 两数之和
分析
要求两数之和等于目标值;
假定只存在一种答案;
答案中不能使用数组中同样的元素,即必定是两个数;
输入值是整数 - 无需考虑其他类型;
解决方案1
内层使用indexOf计算是否存在对应差值
时间&空间
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let length = nums.length
let result = []
if (length !== 0) {
for (let i = 0; i < length; i++) {
let diff = target - nums[i]
let indexofNum = nums.indexOf(diff)
if (indexofNum !== -1 && i !== indexofNum) {
result.push(i, nums.indexOf(diff))
break
}
}
}
return result
};
解决方案2
使用双层for循环,外层循环遍历数组,内层(从i+1开始)循环计算数组中是否存在(target - 当前数值)
时间&空间
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let length = nums.length
let result = []
if (length !== 0) {
for (let i = 0; i < length; i++) {
let diff = target - nums[i]
for (let j = i + 1; j< length; j++) {
if (nums[j] === diff) {
result.push(i, j)
break
}
}
}
}
return result
};
解决方案3
使用单层循环,维护一个obj
以当前循环中的value为基点,计算diff(target-value)
判断diff是否为obj的key,如果在obj中则命中结果
如果不在,则将当前value作为key,index作为值存入obj中(要在比较之后存入,因为题干中不允许使用同一个元素)
时间&空间
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let length = nums.length
let result = []
let temp = {}
if (length !== 0) {
for (let i = 0; i < length; i++) {
let diff = target - nums[i]
if (temp[diff] !== undefined) {
result.push(temp[diff], i)
}
temp[nums[i]] = i
}
}
return result
};
题目2 两数之和
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
链接:https://leetcode-cn.com/problems/add-two-numbers
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解法
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
let carry = 0;
let head = new ListNode();
let cur = head;
while(l1 || l2 || carry) {
let sum = (l1 && l1.val || 0) + (l2 && l2.val || 0) + carry;
carry = sum >= 10 ? 1 : 0;
let curval = sum % 10
cur.next = new ListNode(curval);
cur = cur.next
l1 = l1 && l1.next || null
l2 = l2 && l2.next || null
}
// head 是空节点,返回head.next 为头节点
return head.next
};
题目3 回文
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
链接:https://leetcode-cn.com/problems/add-two-numbers
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解法
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
let strX = String(x)
let reverseX = strX.split('').reverse().join('')
if (reverseX === strX) {
return true
}
return false
};
// 官方解法
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if (isNaN(x)) return false
// 当数字为负数或者数字最后一位为0时返回false 因为不可能存在数字以0开头
if (x < 0 || (x % 10 === 0 && x !== 0 )) return false
let reverseX = 0
while(x > reverseX) {
reverseX = reverseX * 10 + x % 10
// js 中除法 / 不会自动去除小数
x = parseInt(x / 10)
}
return x === reverseX || x === parseInt(reverseX/10)
};