JS算法练习题(附带答案)- 2

170 阅读2分钟

此文章中的算法题目均来自 力扣(LeetCode)

链接:leetcode-cn.com/problems/me…

1. 寻找两个正序数组的中位数

给定两个大小分别为 mn 的正序(从小到大)数组 nums1nums2。请你找出并返回这两个正序数组的 中位数

示例 1:

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

示例 3:

输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000

示例 4:

输入:nums1 = [], nums2 = [1]
输出:1.00000

示例 5:

输入:nums1 = [2], nums2 = []
输出:2.00000

解答:

/** 
    * @param {number[]} nums1 
    * @param {number[]} nums2 
    * @return {number} 
    */
var findMedianSortedArrays = function (nums1, nums2) {    
    var arr = nums1.concat(nums2)    
    arr.sort(function (a, b) { 
        return a - b 
    })    
    var resullt = 0;    
    // 排序完成,计算中位数    
    var len = arr.length    
    var median = len / 2;    
    if (len % 2 === 0) {        
        resullt = (arr[median] + arr[median - 1]) / 2     
    } else {        
        resullt = arr[Math.floor(median)]    
    }    
    return resullt
};

2. 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

示例 3:

输入:s = "a"
输出:"a"

示例 4:

输入:s = "ac"
输出:"a"

解答:

/** 
    * @param {string} s 
    * @return {string} 
    */
var longestPalindrome = function (s) {    
    var palindrome = "";    
    function isPalindrome(a, b, str) {        
        if (s[a] && s[b] && s[a] === s[b]) {            
            str = s[a] + str + s[a]            
            return isPalindrome(a - 1, b + 1, str);        
        } else {            
            return str;        
        }    
    }    
    for (var i = 0; i < s.length - 1; i++) {        
        var el = s[i];        
        var palindromeStay = "";        
        // 判断下一位与当前位是否相同        
        if (el === s[i + 1]) {            
            palindromeStay = isPalindrome(i - 1, i + 2, el + el);        
        }                
        var palindromeStayB = isPalindrome(i - 1, i + 1, el);        
        if (palindromeStayB.length > palindromeStay.length) palindromeStay = palindromeStayB;
        if (palindromeStay.length > palindrome.length) palindrome = palindromeStay; 
    }   
    return palindrome === "" ? s[0] : palindrome;
};

3. Z 字形变换

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下: 

P   A   H   N
A P L S I I G
Y   I   R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"

示例 2:

输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P     I    N
A   L S  I G
Y A   H R
P     I

示例 3:

输入:s = "A", numRows = 1
输出:"A"

解答:

/** 
    * @param {string} s 
    * @param {number} numRows 
    * @return {string} 
    */
var convert = function (s, numRows) {    
    if(numRows === 1) return s;    
    var result = ''    
    var arr = [];    
    var max = numRows + numRows - 2    
    for (var i = 0; i < s.length; i++) {        
        var index = Math.floor(i / max)        
        var nowI = i % max;        
        var el = s[i]        
        if (nowI < numRows) {            
            if (arr[nowI]) {                
                arr[nowI].push(el);            
            } else {               
                arr[nowI] = [el];            
            }        
        } else {            
            var elI = max - nowI;            
            for (let j = 0; j < arr.length; j++) {                
                if (j === elI) {                    
                    arr[j].push(el);                
                } else {                    
                    arr[j].push('')                
                }            
            }        
        }    
    }        
    for (let i = 0; i < arr.length; i++) {        
        result += arr[i].join('')            
    }    
    return result;
};

如有疑问,欢迎留言。

本人也会不定期的更新一些其他的前端干货,或者此类的算法联系,欢迎各位点赞、关注、留言。谢谢观看!!!