LeetCode刷题(七)

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);
    });
};

题目

2的幂

思路

当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
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值