LeetCode刷题(四)

LeetCode 是个著名的编程题库,里边有很多面试、算法题目,多刷刷对提高编程水平很有帮助,避免因为天天写业务代码而停滞不前。最近玩了下挺有意思的,决定慢慢的刷起来,在这里记录一下我的刷题过程。

相关资料:

备注:

  • 先从简单的开始刷,简单记录每道题的题目,解法和思路。
  • 因为之前并没有什么算法基础,所以很多解法可能并不是最优解。
  • 先把重点放在解题,故有些变量名并不严谨,但代码其他方面都尽可能遵循了规范,并使用ES6+的新特性。

题目

检测大写字母

思路

ASCII,分情况判断。

解法

/**
 * @param {string} word
 * @return {boolean}
 */
var detectCapitalUse = function(word) {
    const firstA = word.charCodeAt(0) >= 65 && word.charCodeAt(0) <= 90;
    let list = word.split('');
    list.shift();
    const allA = list.every(i => {
        return i.charCodeAt(0) >= 65 && i.charCodeAt(0) <= 90;
    });
    const alla = list.every(i => {
        return i.charCodeAt(0) >= 97 && i.charCodeAt(0) <= 122;
    });
    if (firstA && !allA && !alla) {
        return false;
    } else if (!firstA && !alla) {
        return false;
    } else {
        return true;
    }
};

题目

两个数组的交集

思路

取较长的数组和较短的数组,以提高性能。长数组加分隔号变为字符串。短数组遍历每项加分隔号查找是否存在。最后去重。

解法

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function(nums1, nums2) {
    const shortList = nums1.length > nums2.length ? nums2: nums1;
    const longList = nums1.length > nums2.length ? nums1: nums2;
    const longStr = '|' + longList.join('|') + '|';
    let result = shortList.filter(i => {
        return longStr.indexOf(`|${i}|`) >= 0;
    });
    return Array.from(new Set(result));
};

题目

下一个更大元素

思路

循环findNums,找到每个元素在nums中的index,获取nums中,index右侧的元素组成的数组。在其中找到第一个符合题意的元素,找不到就给-1。

解法

/**
 * @param {number[]} findNums
 * @param {number[]} nums
 * @return {number[]}
 */
var nextGreaterElement = function(findNums, nums) {
    let resultList = [];
    findNums.forEach((item, index) => {
        const numsIndex = nums.findIndex(i => {
            return i === item;
        });
        const copyList = nums.map(n => n);
        copyList.splice(0, numsIndex);
        let result = copyList.find(c => {
            return c > item;
        });
        result = result ? result : -1;
        resultList.push(result);
    });
    return resultList;
};

题目

反转整数

思路

判断x是否>=0,大于零则直接反转,小于零则去掉负号-,然后反转。取最大最小值,最后得出结果时溢出则返回0。

解法

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    const max = Math.pow(2,31) - 1;
    const min = Math.pow(-2,31);
    const a = x >= 0;
    let result = 0;
    if (a) {
        result = +(x + '').split('').reverse().join('');
    } else {
        let absList = (x + '').split('');
        absList.splice(0, 1);
        absList.reverse();
        const str = '-' + absList.join('');
        result = +str;
    }
    return result < max && result > min ? result : 0;
};

题目

求众数

思路

转map,key为数字,value为出现次数。遍历map获取符合条件的众数。

解法

/**
 * @param {number[]} nums
 * @return {number}
 */
var majorityElement = function(nums) {
    let map = {};
    nums.forEach(i => {
        map[i] !== undefined ? map[i]++ : map[i]=1;
    });
    let result = 0;
    for (i in map) {
        if (map[i] > nums.length / 2) {
            result = i;
        }
    }
    return +result;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值