LeetCode 是个著名的编程题库,里边有很多面试、算法题目,多刷刷对提高编程水平很有帮助,避免因为天天写业务代码而停滞不前。最近玩了下挺有意思的,决定慢慢的刷起来,在这里记录一下我的刷题过程。
相关资料:
备注:
- 先从简单的开始刷,简单记录每道题的题目,解法和思路。
- 因为之前并没有什么算法基础,所以很多解法可能并不是最优解。
- 先把重点放在解题,故有些变量名并不严谨,但代码其他方面都尽可能遵循了规范,并使用ES6+的新特性。
题目
思路
简单,略。
解法
/**
* @param {number[]} A
* @return {number[]}
*/
var sortArrayByParity = function(A) {
let a = [];
let b = [];
A.map(i => {
if (i % 2 === 0) {
a.push(i);
} else {
b.push(i);
}
})
return [...a, ...b];
};
题目
思路
字符串转数组,嵌套遍历判断相等。
解法
/**
* @param {string} J
* @param {string} S
* @return {number}
*/
var numJewelsInStones = function(J, S) {
const j = J.split("");
const s = S.split("");
let count = 0;
j.map(ij => {
s.map(is => {
if (ij === is) {
count++;
}
});
});
return count;
};
题目
思路
根据上下边界遍历,每个数进行判断:1.有0则肯定不是自除数;2.拆分各位后取余是否为0;
解法
/**
* @param {number} left
* @param {number} right
* @return {number[]}
*/
var selfDividingNumbers = function(left, right) {
let list = [];
let a = left;
while (a <= right) {
let str = a.toString();
let hasZero = str.indexOf(0) > 0;
let d = str.split('').every(i => {
return a % i === 0;
});
if (!hasZero && d) {
list.push(a);
}
a++;
}
return list;
};
题目
思路
这个应该是最优解了。。。略。
解法
/**
* @param {string} s
* @return {string}
*/
var reverseString = function(s) {
return s.split('').reverse().join('');
};
题目
思路
将s转为数组,将数组按k截断为多个数组,放入一个二维数组。遍历该二维数组,将其中下标为偶数且为数组的子元素进行反转。然后转回字符串。
解法
/**
* @param {string} s
* @param {number} k
* @return {string}
*/
var reverseStr = function(s, k) {
let list = s.split('');
let a = [];
if (list.length < k) {
return list.reverse().join('');
}
while(list.length >= k) {
a.push(list.splice(0,k));
}
a = [...a, list];
a.forEach((item, index) => {
if(item instanceof Array && index % 2 === 0) {
item.reverse();
}
});
var str = '';
a.map(i => {
str += i instanceof Array ? i.join('') : i;
});
return str;
};