LeetCode刷题(六)

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

相关资料:

  • 我的LeetCode
  • 我的GitHub

备注:

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

题目

验证回文串

思路

据题意,空串""为true。将字符串转小写并删除a-z0-9之外的字符。转数组,判断长度的奇偶,取左半段和右半段,反转其中之一并比较。

解法

/**
 * @param {string} s
 * @return {boolean}
 */
var isPalindrome = function(s) {
    if (s === '') return true;
    s = s.toLowerCase().replace(/[^a-z0-9]/ig,"");
    let sList = s.split('');
    let [ left, right ] = [ [], [] ];
    if (sList.length % 2 === 0) {
        left = sList.splice(0, sList.length / 2);
        right = sList;
    } else {
        const len = (sList.length + 1) / 2 - 1;
        left = sList.splice(0, len);
        right = sList.splice(1, len);
    }
    return left.reverse().every((item, index) => {
        return item === right[index];
    });
};

题目

两句话中不常见的单词

思路

按空格分割成两个数组,分别遍历,放入同一个map,key为单词,vaule为出现次数。遍历map,value为1的就是不常见单词。

解法

/**
 * @param {string} A
 * @param {string} B
 * @return {string[]}
 */
var uncommonFromSentences = function(A, B) {
    let map = {}
    A.split(' ').map(i => {
        return map[i] === undefined ? map[i] = 1 : map[i]++;
    });
    B.split(' ').map(i => {
        return map[i] === undefined ? map[i] = 1 : map[i]++;
    });
    let result = [];
    for (i in map) {
        if (map[i] === 1) {
            result.push(i);
        }
    }
    return result;
};

题目

字符的最短距离

思路

先取得C在S中的各个index,做成cIndexs数组。然后S拆分为数组并遍历,每个字母的index跟cIndexs中的各个值相减取绝对值然后取最小,放入结果数组。

解法

/**
 * @param {string} S
 * @param {character} C
 * @return {number[]}
 */
var shortestToChar = function(S, C) {
    let cIndexs = [];
    S.split('').map((item, index) => {
        if (item === C) {
            cIndexs.push(index);
        }
    });
    let result = [];
    S.split('').map((item, index) => {
        const distanceList = cIndexs.map((c) => {
            return Math.abs(index - c);
        });
        result.push(Math.min(...distanceList));
    });
    return result;
};

题目

两数之和

思路

遍历数组,取每个元素右边的数组,再遍历,分别求和,与target相等的既符合条件。注意返回index时,right中的index相对于nums中的index会有i+1的偏移,要计入。

解法

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    let result = [];
    out:
    for(let i = 0;i < nums.length;i++) {
        const right = nums.slice(i+1);
        for(let j = 0;j < right.length;j++) {
            if(nums[i] + right[j] === target) {
                result = [i, i+1+j];
                break out;
            }
        }
    }
    return result;
};

题目

搜索插入位置

思路

先在nums中找target,找到则返回索引。否则遍历nums,然后分情况讨论:1.target在nums中最小;2.在nums中间;3.在nums中最大。

解法

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function(nums, target) {
    let index = nums.findIndex(item => {
        return item === target;
    });
    if (index !== -1) {
        return index;
    }
    for(let i=0;i<nums.length;i++) {
        const isMin = i === 0 && target < nums[i];
        if (isMin) {
            index = 0;
            break;
        }
        const isMid = nums[i] < target && nums[i+1] >= target;
        const isMax = i === nums.length-1 && target > nums[i];
        if(isMid || isMax){
            index = i + 1;
            break;
        }
    }
    return index;
};

你可能感兴趣的:(学习笔记,LeetCode)