基本计算器 II
基本计算器 II
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
输入:s = “3+2*2”
输出:7
输入:s = “ 3/2 “
输出:1
12345678910111213141516171819202122232425262728293031var calculate = function(s) { s = s.replace(/\s/g, ``); const stack = []; let i = 0, n = s.length, sign = `+`; while (i < n) { if (s[i] === `+` || s[i] === `-` || s[i] === `*` || s[i] === `/`) { ...
反转字符串中的单词
反转字符串中的单词
给你一个字符串 s ,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。注意:输入字符串 s 中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
输入:s = “the sky is blue”
输出:”blue is sky the”
输入:s = “ hello world “
输出:”world hello”
解释:反转后的字符串中不能存在前导空格和尾随空格。
12345678910111213var reverseWords = function(s) { let sarr = s.trim().split(/\s+/); let i = 0, j = sarr.length-1; for ( ;i<=j; i++, j--) { let tmp = sarr[ ...
最大数
最大数
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
输入:nums = [10,2]
输出:”210”
输入:nums = [3,30,34,5,9]
输出:”9534330”
1234567var largestNumber = function(nums) { if(Number(nums.join(""))){ return nums.map(a=>a.toString()).sort((a,b)=>(b+a)-(a+b)).join("") } return "0"};
二叉树的最大深度
二叉树的最大深度
给定一个二叉树 root ,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
输入:root = [3,9,20,null,null,15,7]
输出:3
输入:root = [1,null,2]
输出:2
1234var maxDepth = function(root) { if (root === null) return 0 return 1 + Math.max(maxDepth(root.left), maxDepth(root.right))};
合并区间
合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
12345678910111213141516var merge = function(intervals) { intervals.sort((a, b) => a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]) let res = [] let start = intervals[0][0], end = intervals ...
排列序列
排列序列
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
“123”
“132”
“213”
“231”
“312”
“321”给定 n 和 k,返回第 k 个排列。
输入:n = 3, k = 3
输出:”213”
输入:n = 4, k = 9
输出:”2314”
123456789101112131415const table = [1, 1, 2, 6, 24, 120, 720, 5040, 40320];var getPermutation = function(n, k) { if (n === 1) return '1'; const ans = []; const arr = []; for (let i = 1; i <= n; i++) arr.push(i); while (n) { const MOD = table[n - 1]; const idx = Math.ceil(k / ...
旋转图像
旋转图像
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
1234567891011var rotate = function(matrix) { var len = matrix.length for (let i = 0; i < Math.floor(len / 2); i++) { for (let j = i; j < len - 1 - i; j++) { [matrix[i][j], matrix[j ...
接雨水
接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
输入:height = [4,2,0,3,2,5]
输出:9
12345678910111213141516171819202122232425var trap = function(height) { const n = height.length; if (n == 0) {//极端情况 return 0; } const leftMax = new Array(n).fill(0);//初始化从左往右看的最大值数组 leftMax[0] = height[0]; for (let i = 1; i < n; ++i) { ...
验证二叉搜索树
验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。
输入:root = [2,1,3]
输出:true
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
123456789101112131415161718var isValidBST = function(root) { if(root == null) {return true}; let arr = [] let isInit = false let temp = Number.MIN_VALUE; while(root!=null || arr.length !=0){ while(root!=null){ arr.push(roo ...
二叉树展开为链表
二叉树展开为链表
给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
输入:root = []
输出:[]
12345678910111213141516171819var flatten = function(root) { while(root) { if(!root.left) { root = root.right; } else { let temp = root.left; // 找到左节点的最右树节点 while(temp.right) temp = temp.right; ...
