LeeCode-刷题日记-Day19

560. 和为 K 的子数组

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var subarraySum = function(nums, k) {
    let count = 0;
    for (let start = 0; start < nums.length; ++start) {
        let sum = 0;
        for (let end = start; end >= 0; --end) {
            sum += nums[end];
            if (sum == k) {
                count++;
            }
        }
    }
    return count;
};

哈希表加前缀的解法

var subarraySum = function(nums, k) {
    const mp = new Map();
    mp.set(0, 1);
    let count = 0, pre = 0;
    for (const x of nums) {
        pre += x;
        if (mp.has(pre - k)) {
            count += mp.get(pre - k);
        }
        if (mp.has(pre)) {
            mp.set(pre, mp.get(pre) + 1);
        } else {
            mp.set(pre, 1);
        }
    }
    return count;
};

415. 字符串相加

模拟竖式加法

/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
var addStrings = function(num1, num2) {
    let i=num1.length-1,j=num2.length-1,add=0;
    let ans=[];
    while(i>=0||j>=0||add!=0){
        let x = i>=0?num1.charAt(i)-'0':0;
        let y = j>=0?num2.charAt(j)-'0':0;
        let res=x+y+add;
        ans.push(res%10);
        add=Math.floor(res/10);
        i--;
        j--;
    }
    return ans.reverse().join('');
};

409. 最长回文串

思路为计算字符串中为偶数的字符串个数,结果直接加。为奇数的字符个数,如果有则结果加一,如果大于1,则取2的倍数加。

/**
 * @param {string} s
 * @return {number}
 */
var longestPalindrome = function(s) {
    let count=0;
    let res=new Array(60).fill(0);
    for(let i=0;i<s.length;i++){
        let dir=s.charCodeAt(i)-65;
        res[dir]++;
    }
    let flag=0;
    for(let i=0;i<60;i++){
        if(res[i]%2===1){
            if(flag===0){
                count++;
                flag=1;
            }
            count+=Math.floor(res[i]/2)*2;
        }
        if(res[i]%2===0){
            count+=res[i];
        }
    }
    return count;
};