判定是否互为字符重排
判定是否互为字符重排
给定两个由小写字母组成的字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
输入: s1 = “abc”, s2 = “bca”
输出: true
输入: s1 = “abc”, s2 = “bad”
输出: false
1234567var CheckPermutation = function(s1, s2) { return reorder(s1) === reorder(s2); function reorder(s: string): string { return s.split("").sort((a, b) => a.charCodeAt(0) - b.charCodeAt(0)).join(""); }};
文物朝代判断
文物朝代判断
展览馆展出来自 13 个朝代的文物,每排展柜展出 5 个文物。某排文物的摆放情况记录于数组 places,其中 places[i] 表示处于第 i 位文物的所属朝代编号。其中,编号为 0 的朝代表示未知朝代。请判断并返回这排文物的所属朝代编号是否连续(如遇未知朝代可算作连续情况)。
输入: places = [0, 6, 9, 0, 7]
输出: True
输入: places = [7, 8, 9, 10, 11]
输出: True
12345678910111213141516var checkDynasty = function(nums) { let set = new Set(); let max = 0, min = 14; for (let a of nums) { // 跳过大小王; if (a == 0) continue; max = Math.max(a, max); min = Math.min(a, min); // 若有重复,提前返回 false if (set. ...
变位词组
变位词组
编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。注意:本题相对原题稍作修改
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
输出:[[“ate”,”eat”,”tea”],[“nat”,”tan”],[“bat”]]
12345678var groupAnagrams = function(strs) { let map = new Map() for( let str of strs ){ let key = str.split('').sort().join('') map.has(key) ? map.get(key).push(str) : map.set(key,[str]) } return [...map.values()]};
峰与谷
峰与谷
在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整数的元素。例如,在数组{5, 8, 4, 2, 3, 4, 6}中,{8, 6}是峰, {5, 2}是谷。现在给定一个整数数组,将该数组按峰与谷的交替顺序排序。
输入: [5, 3, 1, 2, 3]
输出: [5, 1, 3, 2, 3]
12345678var wiggleSort = function(nums) { nums.sort((a, b) => a - b); const ans = [...nums]; let i = 0, left = 0, right = nums.length - 1, flag = 1; while (i < nums.length) { nums[i++] = ans[flag++ % 2 === 0 ? left++ : right--]; }};
交换和
交换和
给定两个整数数组,请交换一对数值(每个数组中取一个数值),使得两个数组所有元素的和相等。返回一个数组,第一个元素是第一个数组中要交换的元素,第二个元素是第二个数组中要交换的元素。若有多个答案,返回任意一个均可。若无满足条件的数值,返回空数组。
输入: array1 = [4, 1, 2, 1, 1, 2], array2 = [3, 6, 3, 3]
输出: [1, 3]
输入: array1 = [1, 2, 3], array2 = [4, 5, 6]
输出: []
123456789101112131415161718192021var findSwapValues = function(array1, array2) { // 计算当前的和 let sum1 = array1.reduce((sum, item) => sum + item); let sum2 = array2.reduce((sum, item) => sum + item); // 处理数组,去除相同的元素 array1 = [...new Set(a ...
判定字符是否唯一
判定字符是否唯一
判定字符是否唯一
输入: s = “leetcode”
输出: false
输入: s = “abc”
输出: true
123var isUnique = function(astr) { return new Set(astr).size === astr.length};
部分排序
部分排序
给定一个整数数组,编写一个函数,找出索引 m 和 n,只要将索引区间[m,n]的元素排好序,整个数组就是有序的。注意:n-m 尽量最小,也就是说,找出符合条件的最短序列。函数返回值为[m,n],若不存在这样的 m 和 n(例如整个数组是有序的),请返回[-1,-1]。
输入: [1,2,4,7,10,11,7,12,6,7,16,18,19]
输出: [3,9]
1234567891011121314151617181920var subSort = function(array) { let numLeft=-1 //初始化 let numRight=-1 //初始化 let max=Number.MIN_SAFE_INTEGER let min=Number.MAX_SAFE_INTEGER for(let i=0;i<array.length;i++){ if(array[i]>=max){ max=array[i] }else ...
消失的数字
消失的数字
数组 nums 包含从 0 到 n 的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在 O(n)时间内完成吗?
输入:[3,0,1]
输出:2
输入:[9,6,4,2,3,5,7,0,1]
输出:8
1234567var missingNumber = function(nums) { // 等差公式求0到n的和,减去nums总和,剩下就是缺少的。 let n = nums.length; let sum = n*(n+1)/2; nums.forEach(el => sum -= el); return sum;};
最大三角形面积
最大三角形面积
给你一个由 X-Y 平面上的点组成的数组 points ,其中 points[i] = [xi, yi] 。从其中取任意三个不同的点组成三角形,返回能组成的最大三角形的面积。与真实值误差在 10-5 内的答案将会视为正确答案。
输入:points = [[0,0],[0,1],[1,0],[0,2],[2,0]]
输出:2.00000
解释:输入中的 5 个点如上图所示,红色的三角形面积最大。
输入:points = [[1,0],[0,0],[0,1]]
输出:0.50000
12345678910111213141516const largestTriangleArea = function(points) { const n = points.length; let ret = 0.0; for (let i = 0; i < n; i++) { for (let j = i + 1; j < n; j++) { for (let k = j + 1; ...
多数元素 II
多数元素 II
给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
输入:nums = [3,2,3]
输出:[3]
输入:nums = [1]
输出:[1]
输入:nums = [1,2]
输出:[1,2]
123456789101112131415161718var majorityElement = function(nums) { let map = new Map(); let len = nums.length; for(let i=0; i<len; i++) { map.set(nums[i], map.has(nums[i]) ? map.get(nums[i]) + 1 : 1) } let seperateLine = Math.floor(len / 3) const res = []; for(let [key, value] of map.entries()) { if(value > se ...