版权声明:本文为博主原创文章,未经博主允许不得转载。原账号CreabineChen现已不用,所有博客均已迁移过来。 https://blog.csdn.net/Creabine/article/details/84644341
LeetCode 是个著名的编程题库,里边有很多面试、算法题目,多刷刷对提高编程水平很有帮助,避免因为天天写业务代码而停滞不前。最近玩了下挺有意思的,决定慢慢的刷起来,在这里记录一下我的刷题过程。
相关资料:
备注:
- 先从简单的开始刷,简单记录每道题的题目,解法和思路。
- 因为之前并没有什么算法基础,所以很多解法可能并不是最优解。
- 先把重点放在解题,故有些变量名并不严谨,但代码其他方面都尽可能遵循了规范,并使用ES6+的新特性。
题目
思路
先找出长度最长的那个字符串,然后把它按分割成字母数组并遍历,对每个字母使用every判断是否是公共前缀。是则加入result,否则:直接break。
解法
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function(strs) {
if(!strs.length) {
return ''
}
const list = strs.map(item => item.split('').length);
let maxIndex = 0;
list.map((length, index) => {
if(length > maxIndex) {
maxIndex = index;
}
});
let maxStrList = strs[maxIndex].split('');
let result = "";
for(let index = 0;index < maxStrList.length;index++){
const eq = strs.every((str) => {
return str.split('')[index] === maxStrList[index];
});
if (eq) {
result += maxStrList[index];
} else {
break
}
}
return result
};
题目
思路
简单,略
解法
/**
* @param {string} s
* @return {number}
*/
var lengthOfLastWord = function(s) {
const list = s.trim().split(' ');
const lastWord = list[list.length - 1];
return lastWord.split('').length;
};
题目
思路
做一个加一完成的标记plusDone,默认为false.反转数组并遍历,对数组的每一项:如果plusDone为true了,说明加一已经完成,直接push到result,否则加一得到itemPlus,然后判断三种情况:1.itemPlus为10且是最后一项,直接push个0,1即可;2.temPlus为10非最后一项,此时push一个0然后下一位再加一;3.若temPlus不为0则必然小于10,此时直接push并且标记plusDone为true
解法
/**
* @param {number[]} digits
* @return {number[]}
*/
var plusOne = function(digits) {
let reverseList = digits.reverse();
let result = [];
let plusDone = false;
for(let i=0;i<reverseList.length;i++) {
if(plusDone) {
result.push(reverseList[i]);
continue;
}
const itemPlus = reverseList[i] + 1;
if (itemPlus == 10 && i+1 == reverseList.length) {
result.push(0);
result.push(1);
} else if(itemPlus == 10 && i+1 != reverseList.length) {
result.push(0);
} else{
result.push(itemPlus);
plusDone = true;
}
}
return result.reverse()
};
题目
思路
首先,当k == nums.length时,数组旋转一周,没变化。所以当k>length时,对k取余,即k = k % length。然后来旋转:其实就是反转数组并取k位,把k位放在数组左侧,其他部分反转回去,即可。
解法
/**
* @param {number[]} nums
* @param {number} k
* @return {void} Do not return anything, modify nums in-place instead.
*/
var rotate = function(nums, k) {
const length = nums.length;
if(length < k) {
k = k % length;
}
let reverseNums = nums.reverse();
let left = reverseNums.splice(0, k);
nums.reverse();
left.forEach(n => {
nums.unshift(n);
});
};
题目
思路
当n小于1或,n为处1外的奇数时,肯定是false。其他时候从0开始求2的i次幂,当结果大于等于n时退出循环,再看结果是大于还是等于n,等于则为true。
解法
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfTwo = function(n) {
if(n < 1 || (n !== 1 && n % 2 !== 0)) {
return false;
}
let i = 0;
while(Math.pow(2,i) < n) {
i++;
}
return Math.pow(2,i) === n
};