字符串相加
给定两个字符串形式的非负整数 num1 和 num2,计算它们的和,并同样以字符串形式返回。
示例:
输入:num1 = "11", num2 = "123"
输出:"134"
思路:最主要的是可以用 while 循环判定
while(flag || i >= 0 || j >= 0)。因为此处若两个数字长度相等且有进位,flag 为 1,但在只判定了两个字符串的长度的情况下会漏掉这个进位。
tsfunction addStrings(num1: string, num2: string): string { let total = "", flag = 0, i = num1.length - 1, j = num2.length - 1; while (flag || i >= 0 || j >= 0) { const cur = Number(num1[i--] || "0") + Number(num2[j--] || "0") + flag; flag = Math.floor(cur / 10); total = (cur % 10) + total; } return total; }
两数之和
给定一个整数数组 nums 和一个整数目标值 target,请在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。
可以假设每种输入只会对应一个答案,并且不能使用两次相同的元素
示例 1:
输入:nums = [2, 7, 11, 15], target = 9
输出:[0, 1]
解释:因为 num[0] + num[1] = 9, 故返回其下标 [0, 1]
思路:注意这个题因为要返回下标,所以不能
sort排序。跟之前Set的题目作比较,会发现Map更适合这种需要同时存储键值对的。像这里就可以利用map建立从值到键的映射,遍历数组元素并在map中查找有没有这个值,有这个值则返回其键(也就是 idx)
tsfunction twoSum(nums: number[], target: number): number[] { const map = new Map(); for (let i = 0; i < nums.length; i++) { const need = target - nums[i]; if (map.has(need)) { return [map.get(need), i]; } map.set(nums[i], i); } }
有效的括号
给定一个只包括 (,),{,},[,] 的字符串 s,判断字符串是否有效。
有效字符串需要满足:
-
左括号必须用相同类型的右括号闭合。
-
左括号必须以正确的顺序闭合。
-
每个右括号都有一个对应的相同类型的左括号。
示例:
输入:s = "()"
输出:true
tsconst pair = { "(": ")", "[": "]", "{": "}", }; const isLeft = (value) => Object.keys(pair).find((item) => item === value); const isPair = (left, right) => pair[left] === right; function isValid(s: string): boolean { const str = s.split(""); let stack = []; for (let i = 0; i < str.length; i++) { if (isLeft(str[i])) { stack.push(str[i]); continue; } const lastLeft = stack.pop(); if (isPair(lastLeft, str[i])) { continue; } return false; } return stack.length === 0; }
Article Index