算法刷题——map、位运算、贪心

601 阅读1分钟

leetcode例题


389找不同

给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。

示例:
输入:
s = "abcd" t = "abcde"
输出:e
解释:
'e' 是那个被添加的字母。

leetcode-cn.com/problems/fi…

解题思路1

用map存放s的各个字符的频率,然后遍历t的时候逐一减去,直到遇到减为0或者不存在的键就输出。

/**
 * @param {string} s
 * @param {string} t
 * @return {character}
 */
let findTheDifference = function(s, t) {
    let map = {};
    for(let i = 0; i < s.length; i++){
        map[s[i]] = !map[s[i]] ? 1 : map[s[i]] + 1 ;
    }
    for(let j = 0; j < t.length; j++){
        if(!map[t[j]] || map[t[j]] ===0)
            return t[j];
        map[t[j]]--;
    }
};

解题思路2

位运算,把两个字符串看成一个字符串,问题就转化成在一个字符串找出现奇数次的字符(s和t中的字符只有一个不一样),所以采用异或方法(同为0异为1),异或所有字符字符之后结果就是那个不同的字符。

/**
 * @param {string} s
 * @param {string} t
 * @return {character}
 */
let findTheDifference = function(s, t) {
    let res  = t[0];
    for(let i = 0; i < s.length; i++){
        res = res ^ s[i];
    }
    for(let j = 1; j < t.length; j++){
        res = res ^ t[j];
    }
    return res;
};

350.两个数组的交集 II

给定两个数组,编写一个函数来计算它们的交集。

示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]

输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。 我们可以不考虑输出结果的顺序。

leetcode-cn.com/problems/in…

解题思路

使用两个Map分别存储两个数组中各个数字的频率,然后遍历其中一个map,如果这个键在两个map中都出现就返回小的那个个数。

另一种解法解法是先排序,然后使用两个指针遍历两个数组。如果两个数字不相等,则将指向较小数字的指针右移一位,如果两个数字相等,将该数字添加到答案,并将两个指针都右移一位。当至少有一个指针超出数组范围时,遍历结束。

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersect = function(nums1, nums2) {
    let map1 = {};
    let map2 = {};
    let res = [];
    for(let i = 0; i < nums1.length; i++){
        map1[nums1[i]] = map1[nums1[i]] ? map1[nums1[i]]+1 : 1;
    }
    for(let i = 0; i < nums2.length; i++){
        map2[nums2[i]] = map2[nums2[i]] ? map2[nums2[i]]+1 : 1;
    }
   
    for(let num in map1){
        if(map2[num]){//对应的数在nums2中也存在
            let min = Math.min(map1[num], map2[num]);
            while(min--){
                res.push(num);
            }
        }
    }
    return res;
};

122 买卖股票的最佳时机

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
示例 2:
输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例  3:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

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

思路解析

贪心算法:只要比前一天的价格大就在(昨天买入)今天卖出。

/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function(prices) {
    let pro = 0;
    for( let i = 1; i < prices.length; i++){
        if(prices[i] > prices[i-1]){
            pro += (prices[i] - prices[i-1]);
        }
    }
    return pro;
};