LeetCode刷题(三)

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

相关资料:

备注:

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

题目

找不同

思路

t生成map和list,s生成map。map的key为字母,value为出现次数。遍历tList,若在s中找不到字母则直接返回,若都能找到,则返回出现次数不同的那个字母。

解法

/**
 * @param {string} s
 * @param {string} t
 * @return {character}
 */
var findTheDifference = function(s, t) {
    const tList = t.split('');
    const sMap = {};
    s.split('').forEach(i => {
        sMap[i] !== undefined ? sMap[i]++ : sMap[i]=0;
    });
    let character = '';
    let tMap = {};
    tList.forEach(i => {
       if (s.indexOf(i) < 0) {
           character = i;
           return;
       } else {
           tMap[i] !== undefined ? tMap[i]++ : tMap[i]=0;
       }
    });
    if (character !== '') {
        return character;
    }
    for (si in sMap) {
        if (tMap[si] !== sMap[si]) {
            character = si;
        }
    }
    return character;
};

题目

只出现一次的数字

思路

遍历生成map,key为数字,value为出现次数,返回只出现一次的。

解法

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    let map = {};
    nums.forEach(i => {
        map[i] !== undefined ? map[i]++ : map[i]=0;
    });
    let result = null;
    for (i in map) {
        if (map[i] === 0) {
            result = +i;
        }
    }
    return result;
};

题目

缺失数字

思路

排序,数组长度为0,1时单独判断。其他情况遍历判断前后元素是否相差1,不相差1则找到。

解法

/**
 * @param {number[]} nums
 * @return {number}
 */
var missingNumber = function(nums) {
    nums.sort((a,b) => {
        return a - b;
    });
    if (nums[0] !== 0) return 0;
    let result = null;
    if (nums.length === 1) {
        return nums[0] === 0 ? 1 : 0;
    }
    nums.forEach((item ,index) => {
        if (index+1 < nums.length && item+1 !== nums[index+1]) {
            result = item+1;
        }
    });
    return result ? result : nums.length;
};

题目

转置矩阵

思路

双重遍历。

解法

/**
 * @param {number[][]} A
 * @return {number[][]}
 */
var transpose = function(A) {
    let result = [];
    for (let i=0;i<A[0].length;i++) {
        let item = [];
        A.forEach(j => {
            item.push(j[i]);
        });
        result.push(item);
    }
    return result;
};

题目

回文数

思路

小于0肯定不是。其他情况转为数组,判断长度奇偶,然后取前后,反转并比较每项是否相等。

解法

/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
    if (x < 0) {
        return false;
    }
    const list = (x+'').split('');
    if (list.length % 2 === 0) {
        const half = list.splice(0, list.length/2);
        return list.reverse().every((item, index) => {
            return half[index] === item;
        });
    } else {
        const half = list.splice(0, (list.length+1)/2-1);
        list.shift();
        return list.reverse().every((item, index) => {
            return half[index] === item;
        });
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值