leetcode刷题打卡-第二天

101 阅读1分钟

20. 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。

var isValid = function (s) {
    const arr = s.split('');
    const dict = {
        "(": ")",
        "{": "}",
        "[": ']'
    }
    const stack = [];

    for (let i = 0; i < arr.length; i++) {
        let item = stack[stack.length - 1]
        if (stack.length && dict[item] === arr[i]) {
            stack.pop()
        } else {
            stack.push(arr[i])
        }
    }

    return stack.length === 0

};

21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例 1:

var mergeTwoLists = function (list1, list2) {

    if (list1 === null) {
        return list2
    }
    if (list2 === null) {
        return list1
    }

    if (list1.val < list2.val) {
        list1.next = mergeTwoLists(list1.next,list2)
        return list1
    }else{
        list2.next=mergeTwoLists(list2.next,list1)
        return list2
    }

};

26. 删除有序数组中的重复项

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

将最终结果插入 nums 的前 k 个位置后返回 k 。

不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

var removeDuplicates = function(nums) {
    let stack = [];
    for(let i=0;i<nums.length;i++){
        if(!stack.includes(nums[i])){
            stack.push(nums[i])
        }else{
            nums.splice(i,1)
            i--
        }
    }
    return nums.length
};

// 或者
var removeDuplicates = function (nums) {
    for (let i = 0; i < nums.length; i++) {
        if(nums[i]===nums[i+1]){
            nums.splice(i,1);
            i--
        }
    }
    return nums.length
};

27. 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

var removeElement = function (nums, val) {
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] === val) {
            nums.splice(i, 1)
            i--
        }
    }
    return nums.length

};

28. 实现 strStr()

实现 strStr() 函数。

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回  -1 ****。

说明:

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。

var strStr = function(haystack, needle) {
    if(!needle){
        return 0
    }
    return haystack.indexOf(needle)

};

35. 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

var searchInsert = function (nums, target) {
    let left = 0, right = nums.length - 1
    while (left <= right) {
        let mid = Math.floor((right+left) / 2);
        if (nums[mid] === target) {
            return mid
        } else if (nums[mid] > target) { //在左半边查找
            right = mid-1
        } else { //在右半边查找
            left = mid+1
        }
    }
    return left
};