`
xingbinice
  • 浏览: 42099 次
  • 性别: Icon_minigender_1
  • 来自: 海南
社区版块
存档分类
最新评论

leetCode周赛82解题报告 JavaScript

阅读更多

比赛地址
https://leetcode.com/contest/weekly-contest-82

 

824. Goat Latin

A sentence S is given, composed of words separated by spaces. Each word consists of lowercase and uppercase letters only.

We would like to convert the sentence to "Goat Latin" (a made-up language similar to Pig Latin.)

The rules of Goat Latin are as follows:

  • If a word begins with a vowel (a, e, i, o, or u), append "ma" to the end of the word.
    For example, the word 'apple' becomes 'applema'.
     
  • If a word begins with a consonant (i.e. not a vowel), remove the first letter and append it to the end, then add "ma".
    For example, the word "goat" becomes "oatgma".
     
  • Add one letter 'a' to the end of each word per its word index in the sentence, starting with 1.
    For example, the first word gets "a" added to the end, the second word gets "aa" added to the end and so on.

Return the final sentence representing the conversion from S to Goat Latin. 

 

Example 1:

Input: "I speak Goat Latin"
Output: "Imaa peaksmaaa oatGmaaaa atinLmaaaaa"

Example 2:

Input: "The quick brown fox jumped over the lazy dog"
Output: "heTmaa uickqmaaa rownbmaaaa oxfmaaaaa umpedjmaaaaaa overmaaaaaaa hetmaaaaaaaa azylmaaaaaaaaa ogdmaaaaaaaaaa"

 

Notes:

  • S contains only uppercase, lowercase and spaces. Exactly one space between each word.
  • 1 <= S.length <= 100.

 

单词首字母若是辅音放至最后,首字母原音保持不变,然后每个单词后添加ma、maa、maaa... 

简单难度没什么可说

 

/**
 * @param {string} S
 * @return {string}
 */
var toGoatLatin = function(S) {
    var s = S.split(" ");
    var cur = "ma";
    var vo = new Set(['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']);
    var ans = [];
    for (var i = 0; i < s.length; i++) {
        if (s[i]) {
            cur += "a";
            if (vo.has(s[i][0])) {
                ans.push(s[i] + cur);
            }
            else {
                ans.push(s[i].substring(1) + s[i][0] + cur);
            }
        }
    }
    return ans.join(" ");
};

 

 

 

 

 

825. Friends Of Appropriate Ages

Some people will make friend requests. The list of their ages is given and ages[i] is the age of the ith person. 

Person A will NOT friend request person B (B != A) if any of the following conditions are true:

  • age[B] <= 0.5 * age[A] + 7
  • age[B] > age[A]
  • age[B] > 100 && age[A] < 100

Otherwise, A will friend request B.

Note that if A requests B, B does not necessarily request A.  Also, people will not friend request themselves.

How many total friend requests are made?

Example 1:

Input: [16,16]
Output: 2
Explanation: 2 people friend request each other.

Example 2:

Input: [16,17,18]
Output: 2
Explanation: Friend requests are made 17 -> 16, 18 -> 17.

Example 3:

Input: [20,30,100,110,120]
Output: 
Explanation: Friend requests are made 110 -> 100, 120 -> 110, 120 -> 100.

 

Notes:

  • 1 <= ages.length <= 20000.
  • 1 <= ages[i] <= 120.

 

题意是找出所有满足条件的数对的数量,第三个条件其实可以无视。

由于题目限定了年龄范围是1~120,可以以年龄计数的方式完成计算。

题目标注难度是中等,但给人感觉简单。

 

/**
 * @param {number[]} ages
 * @return {number}
 */
var numFriendRequests = function(ages) {
    var counts = new Array(121).fill(0);
    for (var i = 0; i < ages.length; i++) {
        counts[ages[i]]++; // 统计所有年龄的人数
    }
    var ans = 0;
    for (var i = 0; i < ages.length; i++) {
        for (var j = Math.floor(ages[i] * 0.5 + 7) + 1; j <= ages[i]; j++) {
            if (counts[j] > 0) {
                ans += counts[j];
                if (j == ages[i]) { // 若是自己年龄也满足,则减1
                    ans--;
                }
            }
        }
    }
    return ans;
};

 

 

 

 

 

826. Most Profit Assigning Work

We have jobs: difficulty[i] is the difficulty of the ith job, and profit[i] is the profit of the ith job. 

Now we have some workers. worker[i] is the ability of the ith worker, which means that this worker can only complete a job with difficulty at most worker[i]

Every worker can be assigned at most one job, but one job can be completed multiple times.

For example, if 3 people attempt the same job that pays $1, then the total profit will be $3.  If a worker cannot complete any job, his profit is $0.

What is the most profit we can make?

Example 1:

Input: difficulty = [2,4,6,8,10], profit = [10,20,30,40,50], worker = [4,5,6,7]
Output: 100 
Explanation: Workers are assigned jobs of difficulty [4,4,6,6] and they get profit of [20,20,30,30] seperately.

Notes:

  • 1 <= difficulty.length = profit.length <= 10000
  • 1 <= worker.length <= 10000
  • difficulty[i], profit[i], worker[i]  are in range [1, 10^5]

 

题意是每种工作有着特定的难度和利润,给出每个工人最高能完成的工作的难度,求出所有人的最高利润。

中等难度,但是坑比较多,躺了几回:

1.difficulty和profit数组可能是乱序的,所以需要排序;

2.可能存在两个难度一样、但是利润不一样的工作;

3.由于数据量是10000,所以时间复杂度o(n^2)的算法会超时;

/**
 * @param {number[]} difficulty
 * @param {number[]} profit
 * @param {number[]} worker
 * @return {number}
 */
var maxProfitAssignment = function(difficulty, profit, worker) {
    // 工作难度和利润的映射
    var m = {};
    for (var i = 0; i < difficulty.length; i++) {
        m[difficulty[i]] = m[difficulty[i]] ? Math.max(m[difficulty[i]], profit[i]) : profit[i]; // 可能存在两个难度一样、但是利润不一样的工作
    }
    difficulty.sort((a,b)=>a-b);
    // 工作难度排序之后去掉那些难度高但是利润低的工作
    var newlen = 1;
    for (var i = 1; i < difficulty.length; i++) {
        if (m[difficulty[newlen - 1]] < m[difficulty[i]]) {
            difficulty[newlen++] = difficulty[i];
        }
    }
    difficulty.length = newlen; // 截断数组
    var ans = 0;
    // 由于o(n^2)的算法会超时,需要对worker的难度排序,并以lastj记录最后一次选择的难度,达到提速效果
    worker.sort((a,b)=>a-b);
    var lastj = 0;
    for (var i = 0; i < worker.length; i++) {
        var maxp = 0;
        for (var j = lastj; j < difficulty.length && difficulty[j] <= worker[i]; j++) {
            if (maxp < m[difficulty[j]]) {
                maxp = m[difficulty[j]];
                lastj = j;
            }
        }
        ans += maxp;
    }
    return ans;
};

 看了官方题解的代码,比较简短精炼一些,思路相仿,如下:

/**
 * @param {number[]} difficulty
 * @param {number[]} profit
 * @param {number[]} worker
 * @return {number}
 */
var maxProfitAssignment = function(difficulty, profit, worker) {
    var jobs = difficulty.map((v,i)=>[v, profit[i]]).sort((a,b)=>a[0]-b[0]);
    worker.sort((a,b)=>a-b);
    var ans = 0;
    var maxp = 0; // 由于worker和jobs都是排序过的,能力高的人不会比前面的人利润低,一个变量记录即可
    for (var i = 0, j = 0; i < worker.length; i++) { // j的初始化在外层,内循环不变
        while (j < jobs.length && worker[i] >= jobs[j][0]) {
            maxp = Math.max(maxp, jobs[j++][1]);
        }
        ans += maxp;
    }
    return ans;
};

 

 

 

 

827. Making A Large Island

In a 2D grid of 0s and 1s, we change at most one 0 to a 1.

After, what is the size of the largest island? (An island is a 4-directionally connected group of 1s).

Example 1:

Input: [[1, 0], [0, 1]]
Output: 3
Explanation: Change one 0 to 1 and connect two 1s, then we get an island with area = 3.

Example 2:

Input: [[1, 1], [1, 0]]
Output: 4
Explanation: Change the 0 to 1 and make the island bigger, only one island with area = 1.

Example 3:

Input: [[1, 1], [1, 1]]
Output: 4
Explanation: Can't change any 0 to 1, only one island with area = 1.

 

Notes:

  • 1 <= grid.length = grid[0].length <= 50.
  • 0 <= grid[i][j] <= 1.

 

题意是提供一张01地图,1代表陆地,你可以将任意一个0的位置填充为1,求出你填充之后的最大陆地面积。

难度困难,用深度搜索dfs实现。

/**
 * @param {number[][]} grid
 * @return {number}
 */
var largestIsland = function(grid) {
    var n = grid.length;
    var count = 0;
    var flag = 1;
    var dfs = function(i, j) {
        if (i < 0 || i >= n || j < 0 || j >= n || grid[i][j] == 0 || grid[i][j] == flag) {
            return;
        }
        grid[i][j] = flag;
        count++;
        // 每个点往四个方向拓展
        dfs(i, j + 1);
        dfs(i + 1, j);
        dfs(i, j - 1);
        dfs(i - 1, j);
    }
    var ans = 0;
    for (var i = 0; i < n; i++) {
        for (var j = 0; j < n; j++) {
            if (grid[i][j] === 0) { //找到0的位置
                flag++; // 每次计算将陆地填充为flag
                grid[i][j] = 1; // 暂时填充为1
                // 计算以(i,j)位置拓展的陆地面积有多大,全局count为计算结果
                count = 0;
                dfs(i, j); 
                ans = Math.max(ans, count);
                grid[i][j] = 0; // 还原为0
            }
        }
    }
    // 若ans=0表示整个地图都是1,不需要填充
    return ans > 0 ? ans : (n * n);
};

 分析上面解法,遍历所有0所需时间是n^2,为每个0拓展陆地的时间是n^2,所以整体方案的时间复杂度是o(n^4),其实可以事先计算好每块陆地的面积(时间为n^2),然后可以以常量时间计算每个0四周陆地的面积,将嵌套的循环改为两个步骤进行计算,从而将时间复杂度优化至o(n^2),优化后的代码如下:

/**
 * @param {number[][]} grid
 * @return {number}
 */
var largestIsland = function(grid) {
    var n = grid.length;
    var count = 0;
    var flag = 1;
    var xs = [0,0,1,-1];
    var ys = [1,-1,0,0];
    var dfs = function(i, j) {
        if (i < 0 || i >= n || grid[i][j] !== 1) {
            return;
        }
        grid[i][j] = flag;
        count++;
        // 每个点往四个方向拓展
        for (var d = 0; d < 4; d++) {
            dfs(i + xs[d], j + ys[d]);
        }
    }
    var areas = [0, 0]; // 所有的地块的面积;
    for (var i = 0; i < n; i++) {
        for (var j = 0; j < n; j++) {
            if (grid[i][j] === 1) {
                // 将新陆地填充为flag
                flag++; 
                count = 0;
                dfs(i, j); 
                areas[flag] = count; // 记录flag地块对应的陆地面积
            }
        }
    }
    var ans = 0;
    for (var i = 0; i < n; i++) {
        for (var j = 0; j < n; j++) {
            if (grid[i][j] === 0) { //找到0的位置
                var adjacents = [];
                for (var d = 0; d < 4; d++) {
                    if (i + xs[d] >= 0 && i + xs[d] < n) {
                        var f = grid[i + xs[d]][j + ys[d]];
                        if (f && adjacents.indexOf(f) == -1) {
                            adjacents.push(f); // 找出这个0四个方向相邻的陆地
                        }
                    }
                }
                // 0四周相邻陆地之和
                var cur = adjacents.reduce((pre, f)=>pre+areas[f], 1);
                ans = Math.max(ans, cur);
            }
        }
    }
    // 若ans=0表示整个地图都是1,不需要填充
    return ans > 0 ? ans : (n * n);
};

 

1
0
分享到:
评论

相关推荐

    leetcode周赛难度-leetcode:leetcode

    周赛难度LeetCode 题解 一题目列表 细绳 # 标题 标签 困难 解决方案 描述 1 细绳 中等的 2 细绳 中等的 3 细绳 中等的 4 细绳 中等的 DP # 标题 标签 困难 解决方案 描述 1 DP 中等的 2 DP 中等的 3 DP 中等的 4 DP ...

    leetcode周赛积分-leetcode:leetcode刷题记录

    leetcode周赛积分 leetcode 推荐 No. Problems Solutions Tag 32 DP, Stack 周赛 (weekly-content) No. Solutions Completion Date 2020.07.05 刷题记录 No. Problems Solutions Completion Date 329 2020.07.26 16 ...

    leetcode周赛有原题吗-leetcode:leetcodepractice(Java),包含《剑指offer》和少量《leetbook》

    leetcode周赛有原题吗 leetcode 题号 题目 难度 tag 两数之和 简单 两数相加 中等 无重复字符的最长子串 中等 : 最长回文子串 中等 字符串转换整数 (atoi) 中等 盛最多水的容器 中等 罗马数字转整数 简单 0014 最长...

    leetcode周赛难度-leetcode:我的leetcode代码

    leetcode 周赛难度力码 的代码参考。 当然,我也会每周更新一些关于这些问题的注释,但不是全部。 欢迎开 issue 讨论! 要求 Xcode C++ 11 问题 清单(链表) ID 标题 困难 解决方案 笔记 2 中等的 19 中等的 21 简单...

    leetcode周赛153-LeetCode-Contest:LeetCode周赛题解

    leetcode周赛153 LeetCode-Contest LeetCode 周赛题解 已完成比赛 周赛 比赛场次 【A】题 【B】题 【C】题 【D】题 1201 1202 1203 1207 1208 1209 1210 双周赛 比赛场次 【A】题 【B】题 【C】题 【D】题 1246 初始...

    leetcode周赛排名没了-rust4leetcode:使用Rust刷完leetcode

    leetcode周赛排名没了 定个小目标:用Java、Python、Go、Rust、C++、js六种语言把leetcode刷一遍 为什么要创建此repo? 为了自己。leetcode上好的讲解数不胜数,大佬的解法巧妙绝伦,再写题解给别人看那就是班门弄斧...

    leetcode周赛积分-Leetcode:通过GitHub记录Leetcode的过程

    周赛积分按 issue 记录 Leetcode 的流程 每周比赛 日期 11/10/2019 11/16/2019 11/17/2019 12/8/2019 12/15/2019 12/22/2019 数量 问题 等级 话题 日期 409 简单的 Hash Table 10/25/2019 290 简单的 Array Two ...

    leetcode周赛难度-Weekly-Leetcode-with-STCA:每周LC

    周赛难度每周-Leetcode-with-MS 业主:兰 时间:从 19.12.11 Week6 动态规划 指数 标题 解决方案 验收 困难 70 √ 45.6% 简单的 198 √ 41.5% 简单的 303 √ 40.8% 简单的 64 √ 49.7% 中等的 309 √ 45.2% 中等的 ...

    leetcode周赛奖品-Lemaj:Lemaj-提高编码技能和参加比赛的网站

    leetcode 周赛奖品Lemaj - 提高编码技能和参加比赛的网站 Development on Lemaj has just started. Everything is in flux Lemaj 是什么? Lemaj立志成为一个学习编程的网站,它每周都会举办比赛,任何人都可以参加...

    leetcode周赛难度-leetcode-learn::pencil2:在Scala中总结每周练习

    leetcode 周赛难度LeeCode-Study ======== 总结 Scala 每周练习(每周 5 个问题)。 参考 不。 标题 解决方案 困难 标签 地位 001 简单的 Mapping 完毕 002 中等的 LinkedList 完毕 003 中等的 Mapping 完毕 005 ...

    leetcode周赛得分3-mstcBlog:微博

    周赛是LeetCode举办的一种定期比赛,参赛者在限定时间内解决一系列问题,并根据解题质量和速度获得分数。 描述 "leetcode周赛得分3" 很简洁,表明这是作者参加的第三次LeetCode周赛的结果或者是相关记录。可能包含...

    leetcode周赛191-leetcode:一天一天起来

    【标题】"LeetCode周赛191-逐步提升算法能力" 在LeetCode的周赛191中,参赛者们面临了一系列挑战性的算法题目,旨在帮助他们提升编程技巧和解决复杂问题的能力。LeetCode是一个知名的在线编程平台,提供丰富的算法...

    (LeetCode 解题集之 JavaScript & TypeScript 版).zip

    Solutions collection of LeetCode submissions in JavaScript & TypeScript (LeetCode 解题集之 JavaScript & TypeScript 版).zip

    leetcode周赛积分-LEETCODE:leetcode的问题

    周赛积分LEETCODE 来自 Leetcode 的问题。 您可以找到有关算法和数据结构的一些详细信息。 数据结构 地图 问题编号 名称 语境 001 二和 350 两个数组的交集Ⅱ , 两个指针 简单的 015 三和 设置,地图, 中等的 3 无...

    leetcode周赛难度-leetcode:leetcode项目的问题解决进度

    周赛难度leetcode 这是用于跟踪我在项目中解决问题的进度的存储库。 在30_day_challenge文件夹中,我上传了我的解决方案和其他有趣的每月挑战代码。 在weekly_contest或biweekly_contest文件夹上传我的解决方案,我...

    leetcode周赛194-leetcode-contests:leetcode竞赛

    leetcode 周赛194 力码竞赛 固定 每周比赛 197: 每周比赛 196: 每周竞赛 195: 每周比赛 194: 每周竞赛 193:

    leetcode卡-leetcode-weekly-contest-186:第186届LeetCode周赛

    leetcode卡leetcode-weekly-contest-186 第 186 届 LeetCode 周赛 问题清单 拆分字符串后的最大分数 Given a string s of zeros and ones, return the maximum score after splitting the string into two non-empty...

    Leetcode:LeetCode解题代码

    《LeetCode解题代码——C++篇》 LeetCode是一个广受程序员喜爱的在线平台,它提供了大量的编程挑战,旨在帮助开发者提升算法和数据结构能力。这个资源包中包含的是用C++语言编写的LeetCode题目的解决方案。通过深入...

    我在leetcode上的解题记录。(C++版).zip

    【标题】"我在LeetCode上的解题记录"指的是作者在LeetCode这个在线编程平台上通过C++语言解决了一系列算法问题,并将这些解决方案整理成一个压缩包文件。LeetCode是一个热门的平台,它提供了一系列的编程挑战,旨在...

Global site tag (gtag.js) - Google Analytics