leetcode每天5题-Day13


今天是中等哈希题,已经11点半了,要赶在12点前发出来,所以只能先把题目写好。

1.整数转罗马数字

12. 整数转罗马数字
没做出来,去看题解…
重点:罗马数字的唯一表示法

①模拟
1=<num<=3999

var intToRoman = function(num) {
// 建立数值-符号对数组  从大到小排列
    const val_sym=[[1000,"M"],[900,"CM"],[500,"D"],[400,"CD"],[100,"C"],[90,"XC"],[50,"L"],[40,"XL"],[10,"X"],[9,"IX"],[5,"V"],[4,"IV"],[1,"I"]];
    const ans=[];
    for(const [val,sym] of val_sym){
    // 寻找不超过 num 的最大符号值
        while(num>=val){
            num-=val;
            ans.push(sym);
        }
        if(num==0) break;
    }
    return ans.join('');
};

时间复杂度:O(1)。由于val_sym长度是固定的,且这13字符中的每个字符的出现次数均不会超过33,因此循环次数有一个确定的上限。对于本题给出的数据范围,循环次数不会超过15次。
空间复杂度:O(1)
②硬编码数字
由罗马数字的唯一表示法中的13个符号可以发现:

硬编码表:

var intToRoman = function(num) {
    const thousands = ["", "M", "MM", "MMM"];
    const hundreds = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"];
    const tens     = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"];
    const ones     = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"];

    const ans=[];

    // 利用模运算和除法运算,得到num每个位上的数字
    ans.push(thousands[Math.floor(num/1000)]);
    ans.push(hundreds[Math.floor(num%1000/100)]);
    ans.push(tens[Math.floor(num%100/10)]);
    ans.push(ones[Math.floor(num%10)]);

    return ans.join('');
};

时:O(1)
空:O(1),计算量与输入数字的大小无关

2. 字母异位词分组

49. 字母异位词分组
题目: 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

力扣官方解法:使用哈希表存储每一组字母异位词,哈希表的键为一组字母异位词的标志,哈希表的值为一组字母异位词列表。
遍历每个字符串,对于每个字符串,得到该字符串所在的一组字母异位词的标志,将当前字符串加入该组字母异位词的列表中。遍历全部字符串之后,哈希表中的每个键值对即为一组字母异位词。

以下两种方法分别使用排序和计数作为哈希表的键。
①排序
将排序之后的字符串作为哈希表的键

Array.from()

var groupAnagrams = function(strs) {
    const map=new Map();
    for(let str of strs){
        let array=Array.from(str);
        array.sort();
        let key=array.toString();
        let list=map.get(key)?map.get(key):new Array();
        list.push(str);
        map.set(key,list);
    }
    return Array.from(map.values());
};

时:O(nklogk)nstrs中的字符串的数量,kstrs中的字符串的最大长度。需要遍历n个字符串,对于每个字符串,需要O(klogk)的时间进行排序以及O(1)的时间更新哈希表。
空:O(nk),需要用哈希表存储全部字符串。
②计数
将每个字母出现的次数使用字符串表示,作为哈希表的键:
(对于每个字符串,可以使用长度为26的数组记录每个字母出现的次数。)

var groupAnagrams = function(strs) {
    const map=new Object();
    for(let str of strs){
        const count=new Array(26).fill(0);
        for(let c of str){
            // 不理解为什么要   -'a'.charCodeAt()
            count[c.charCodeAt()-'a'.charCodeAt()]++;
        }
        map[count]?map[count].push(str):map[count]=[str];
    }
    return Object.values(map);
};

👆未看懂…

3.单词拆分

139. 单词拆分

4.连续的子数组和

523. 连续的子数组和

5.分数到小数

166. 分数到小数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值