LeetCode刷题(五)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值