来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/th…
字符串
1. 判断字符是否唯一
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。 示例 1: 输入: s = "leetcode" 输出: false
示例 2: 输入: s = "abc" 输出: true
var isUnique = function(astr) {
const set = new Set(astr);
return [...set].length === astr.length;
};
01.03. URL化
URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)
示例 1: 输入:"Mr John Smith ", 13 输出:"Mr%20John%20Smith"
示例 2: 输入:" ", 5 输出:"%20%20%20%20%20"
var replaceSpaces = function(S, length) {
const str = S.slice(0, length);
return str.replaceAll(' ', '%20');
};
罗马数字转整数
罗马数字包含以下七种字符: I
, V
, X
, L
,C
,D
和 M
。给定一个罗马数字,将其转换成整数。
示例 1:
输入: s = "III"
输出: 3
示例 2: 输入: s = "IV" 输出: 4
示例 3: 输入: s = "IX" 输出: 9
示例 4: 输入: s = "LVIII" 输出: 58 解释: L = 50, V= 5, III = 3.
示例 5: 输入: s = "MCMXCIV" 输出: 1994 解释: M = 1000, CM = 900, XC = 90, IV = 4.
var romanToInt = function(s) {
const map = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
}
const len = s.length;
let res = 0;
for(let i = 0; i < n; i++) {
if(i < n - 1 && map[s[i]] < map[s[i + 1]]) {
res -= map[s[i]];
}
else {
res += map[s[i]];
}
}
return res;
}
14. 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入:strs = ["flower","flow","flight"] 输出:"fl"
示例 2: 输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。
var longestCommonPrefix = function(strs) {
if(!strs.length) {
return '';
}
const getCommonPrefix = function(str1, str2) {
let len = Math.min(str1.length, str2.length);
let i = 0;
while(i < len && str1[i] === str2[i]) {
i++;
}
return str1.slice(0, i);
}
let prefix = strs[0]
for(let i = 1; i < strs.length; i++) {
prefix = getCommonPrefix(prefix, strs[i]);
if(!prefix.length) return '';
}
return prefix;
}
数组
945. 使数组唯一的最小增量
给你一个整数数组 nums 。每次 move 操作将会选择任意一个满足 0 <= i < nums.length 的下标 i,并将 nums[i] 递增 1。 返回使 nums 中的每个值都变成唯一的所需要的最少操作次数。
示例 1: 输入:nums = [1,2,2] 输出:1 解释:经过一次 move 操作,数组将变为 [1, 2, 3]。
示例 2: 输入:nums = [3,2,1,2,1,7] 输出:6 解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。 可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。
var minIncrementForUnique = function(nums) {
nums.sort((a, b) => a - b);
let len = nums.length;
let res = 0
for(let i = 1; i < len; i++) {
if(nums[i] <= nums[i - 1]) {
let n = nums[i - 1] + 1 - nums[i]
res += n;
nums[i] += n;
}
}
return res;
};
面试题 17.16. 按摩师
一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
示例 1: 输入: [1,2,3,1] 输出: 4 解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。
示例 2: 输入: [2,7,9,3,1] 输出: 12 解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 = 2 + 9 + 1 = 12。
示例 3: 输入: [2,1,4,5,3,1,1,3] 输出: 12 解释: 选择 1 号预约、 3 号预约、 5 号预约和 8 号预约,总时长 = 2 + 4 + 3 + 3 = 12。
var massage = function(nums) {
const len = nums.length;
if(!len) return 0;
const dp = [nums[0], Math.max(nums[0], nums[1])];
for(let i = 2; i < len; i++) {
dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
}
return dp[len -1];
};
矩阵
836. 矩形重叠
矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。矩形的上下边平行于 x 轴,左右边平行于 y 轴。 如果相交的面积为 正 ,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。 给出两个矩形 rec1 和 rec2 。如果它们重叠,返回 true;否则,返回 false 。
示例 1: 输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3] 输出:true
示例 2: 输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1] 输出:false
示例 3: 输入:rec1 = [0,0,1,1], rec2 = [2,2,3,3] 输出:false
var isRectangleOverlap = function(rec1, rec2) {
if(
rec2[1] >= rec1[3]
|| rec2[3] <= rec1[1]
|| rec2[0] >= rec1[2]
|| rec2[2] <= rec1[0]
) {
return false;
}
return true;
};
数字
69. x 的平方根
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1: 输入:x = 4 输出:2 示例 2: 输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
var mySqrt = function(x) {
if(x === 0) return 0;
let r = 1;
while(!( r * r <= x && (r + 1) * (r + 1) > x)) {
r = parseInt(r - (r * r - x) / (2 * r));
}
return r;
};