版权声明:本文为博主原创文章,未经博主允许不得转载。原账号CreabineChen现已不用,所有博客均已迁移过来。 https://blog.csdn.net/Creabine/article/details/84644217
LeetCode 是个著名的编程题库,里边有很多面试、算法题目,多刷刷对提高编程水平很有帮助,避免因为天天写业务代码而停滞不前。最近玩了下挺有意思的,决定慢慢的刷起来,在这里记录一下我的刷题过程。
相关资料:
备注:
- 先从简单的开始刷,简单记录每道题的题目,解法和思路。
- 因为之前并没有什么算法基础,所以很多解法可能并不是最优解。
- 先把重点放在解题,故有些变量名并不严谨,但代码其他方面都尽可能遵循了规范,并使用ES6+的新特性。
题目
思路
设置数组belongStr,当数字全都又belongStr中的数字组成时,可翻转。设置数组eqStr,当数字全部由eqStr中的数字组成时,翻转后会相等。遍历数字,当belong && !eq时才满足条件,计算数量。
解法
/**
* @param {number} N
* @return {number}
*/
var rotatedDigits = function(N) {
const belongStr = '0125689';
const eqStr = '018';
let result = 0;
for(let i = 1;i <= N;i++) {
const list = (i + '').split('');
const belong = list.every(j => {
return belongStr.indexOf(j) !== -1;
});
const eq = list.every(j => {
return eqStr.indexOf(j) !== -1;
});
if(belong && !eq) {
result++;
}
}
return result;
};
题目
思路
转二进制,转数组,长度为1时为true,否则every()判断相邻元素是否相等。
解法
/**
* @param {number} n
* @return {boolean}
*/
var hasAlternatingBits = function(n) {
let two = n.toString(2).split('');
if (two.length === 1) {
return true;
}
return two.every((item, index) => {
return item !== two[index + 1];
});
};
题目
思路
先排序,然后把相等元素的index都取出来放入indexList,根据indexList得到下标和数量然后删除。
解法
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function(nums, val) {
let indexList = [];
nums.sort((a, b) => {
return a - b;
});
nums.forEach((item, index) => {
if(item === val) {
indexList.push(index);
}
});
const indexFirst = indexList[0];
const indexCount = indexList.length;
nums.splice(indexFirst, indexCount)
return nums.length;
};
题目
思路
制作全部字符的map和两位字符(题目中的特例,即小的数字在大的数字左边)的twoMap。将字符串分割为数组,遍历,每个元素跟后一个元素组成两位,判断该两位是否在twoMap中,若在则删除后一个元素。同时将合法的元素存入数组,最后遍历数组求和。
解法
/**
* @param {string} s
* @return {number}
*/
var romanToInt = function(s) {
const map = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000,
IV: 4,
IX: 9,
XL: 40,
XC: 90,
CD: 400,
CM: 900
};
const twoMap = {
IV: 4,
IX: 9,
XL: 40,
XC: 90,
CD: 400,
CM: 900
};
const sList = s.split('');
let list = [];
sList.forEach((item, index) => {
const two = item + sList[index+1];
if (twoMap[two]) {
list.push(two);
sList.splice(index+1, 1);
} else {
list.push(item);
}
});
let result = 0;
list.forEach(item => {
return result += map[item];
});
return result;
};
题目
思路
遍历prices,获取每个元素后的所有元素组成的数组,取最大值,求最大利润。若有新的最大利润则覆盖。最后返回最大利润。
解法
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
let maxp = 0;
prices.forEach((item, index) => {
const futurePrices = prices.slice(index + 1);
const profit = Math.max(...futurePrices) - item;
if (profit > maxp) {maxp = profit}
});
return maxp;
};