最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 算法刷题——map、位运算、贪心

    正文概述 掘金(从零开始的程序媛)   2021-02-01   379

    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。
    

    链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii

    思路解析

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

    /**
     * @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;
    };
    

    起源地下载网 » 算法刷题——map、位运算、贪心

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元