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
};