LeetCode刷题笔记 - JavaScript(十五)

剑指 Offer II 033. 变位词组
剑指 Offer II 034. 外星语言是否排序
剑指 Offer II 035. 最小时间差

1.剑指 Offer II 033. 变位词组

给定一个字符串数组 strs ,将 变位词 组合在一起。 可以按任意顺序返回结果列表。
注意:若两个字符串中每个字符出现的次数都相同,则称它们互为变位词。

题目大意:把字符串数组中所有的变位词组放在同一个集合中返回。变位词组就是指字符串由相同字符组成的字符串。

解题思路:基础做法就是将字符串中的字符排序,然后以排序后的字符串为键,值为以当前字符组成的字符串集合。在此之上的优化写法是用计数法替代排序,用O(n)的时间和空间复杂度,优化掉排序的时间复杂度。

代码

	var groupAnagrams = function(strs) {
    let map = new Map();
    for(const str of strs) {
        const arr = new Array(26).fill(0);
        for(const ch of str) {
            arr[ch.charCodeAt() - 'a'.charCodeAt()] ++;
        }
        let temp = "";
        for(let i = 0;i < 26; i++) {
            if(arr[i]) {
                temp += String.fromCharCode(i+97) + arr[i];
            }
        }
        
        if(map.has(temp)) {
            map.get(temp).push(str);
        } else {
            map.set(temp,[str]);
        }
    }
    return [...map.values()];
};

2.剑指 Offer II 034. 外星语言是否排序

某种外星语也使用英文小写字母,但可能顺序 order 不同。字母表的顺序(order)是一些小写字母的排列。
给定一组用外星语书写的单词 words,以及其字母表的顺序 order,只有当给定的单词在这种外星语中按字典序排列时,返回 true;否则,返回 false。

题目大意:将字母的排列顺序打乱,问字符串数组是否按照字母顺序排列。

解题思路:首先,离线处理字符序列。然后枚举字符串,看字符串组是否有按照字符顺序排列。

代码

var isAlienSorted = function(words, order) {
    const arr = new Array(26).fill(0);
    for(let i = 0; i < order.length; i++) {
        arr[order[i].charCodeAt() - 97] = i;
    }
    let flag;
    for(let i = 1; i < words.length; i++) {
        flag = false;
        for(let j = 0; j < words[i - 1].length && j < words[i].length; j++) {
            const pre = words[i-1][j];
            const cur = words[i][j];
            if(arr[pre.charCodeAt() - 97] < arr[cur.charCodeAt() - 97]) {
               flag = true;
               break;
            } else if(arr[pre.charCodeAt() - 97] > arr[cur.charCodeAt() - 97]) {
                return false;
            }
        }
        if(!flag) {
            if(words[i-1].length > words[i].length) {
                return false;
            }
        }
    }
    return true;
};

3.剑指 Offer II 035. 最小时间差

给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。

题目大意:求n个时间中的最小时间差。

解题思路:将n个时间排序,则最小时间差必然出现在相邻两个/首位时间中,然后根据鸽巢原理,只有1440中时间情况,当时间的情况超过1440时,则最小时间差为0.
代码

var findMinDifference = function(timePoints) {
    const n = timePoints.length;
    if(n > 1440) return 0;
    timePoints.sort();
    let pre = getminu(timePoints[0]);
    let ans = pre - getminu(timePoints[n-1]) + 1440;
    for(let i = 1;i < n; i++) {
        const cur = getminu(timePoints[i]);
        ans = Math.min(ans, cur - pre);
        pre = cur;
    }
    return ans;
};

function getminu(time) {
    const zero = '0'.charCodeAt();
    return ((time[0].charCodeAt() - zero) * 10 + time[1].charCodeAt() - zero) *60 + ((time[3].charCodeAt() - zero) * 10 + time[4].charCodeAt() - zero);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

volit_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值