leetcode — (JS)

题目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)
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值