LeetCode 是个著名的编程题库,里边有很多面试、算法题目,多刷刷对提高编程水平很有帮助,避免因为天天写业务代码而停滞不前。最近玩了下挺有意思的,决定慢慢的刷起来,在这里记录一下我的刷题过程。
相关资料:
备注:
验证回文串
据题意,空串""为true。将字符串转小写并删除a-z0-9之外的字符。转数组,判断长度的奇偶,取左半段和右半段,反转其中之一并比较。
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
if (s === '') return true;
s = s.toLowerCase().replace(/[^a-z0-9]/ig,"");
let sList = s.split('');
let [ left, right ] = [ [], [] ];
if (sList.length % 2 === 0) {
left = sList.splice(0, sList.length / 2);
right = sList;
} else {
const len = (sList.length + 1) / 2 - 1;
left = sList.splice(0, len);
right = sList.splice(1, len);
}
return left.reverse().every((item, index) => {
return item === right[index];
});
};
两句话中不常见的单词
按空格分割成两个数组,分别遍历,放入同一个map,key为单词,vaule为出现次数。遍历map,value为1的就是不常见单词。
/**
* @param {string} A
* @param {string} B
* @return {string[]}
*/
var uncommonFromSentences = function(A, B) {
let map = {}
A.split(' ').map(i => {
return map[i] === undefined ? map[i] = 1 : map[i]++;
});
B.split(' ').map(i => {
return map[i] === undefined ? map[i] = 1 : map[i]++;
});
let result = [];
for (i in map) {
if (map[i] === 1) {
result.push(i);
}
}
return result;
};
字符的最短距离
先取得C在S中的各个index,做成cIndexs数组。然后S拆分为数组并遍历,每个字母的index跟cIndexs中的各个值相减取绝对值然后取最小,放入结果数组。
/**
* @param {string} S
* @param {character} C
* @return {number[]}
*/
var shortestToChar = function(S, C) {
let cIndexs = [];
S.split('').map((item, index) => {
if (item === C) {
cIndexs.push(index);
}
});
let result = [];
S.split('').map((item, index) => {
const distanceList = cIndexs.map((c) => {
return Math.abs(index - c);
});
result.push(Math.min(...distanceList));
});
return result;
};
两数之和
遍历数组,取每个元素右边的数组,再遍历,分别求和,与target相等的既符合条件。注意返回index时,right中的index相对于nums中的index会有i+1的偏移,要计入。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let result = [];
out:
for(let i = 0;i < nums.length;i++) {
const right = nums.slice(i+1);
for(let j = 0;j < right.length;j++) {
if(nums[i] + right[j] === target) {
result = [i, i+1+j];
break out;
}
}
}
return result;
};
搜索插入位置
先在nums中找target,找到则返回索引。否则遍历nums,然后分情况讨论:1.target在nums中最小;2.在nums中间;3.在nums中最大。
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function(nums, target) {
let index = nums.findIndex(item => {
return item === target;
});
if (index !== -1) {
return index;
}
for(let i=0;i<nums.length;i++) {
const isMin = i === 0 && target < nums[i];
if (isMin) {
index = 0;
break;
}
const isMid = nums[i] < target && nums[i+1] >= target;
const isMax = i === nums.length-1 && target > nums[i];
if(isMid || isMax){
index = i + 1;
break;
}
}
return index;
};