• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    SQL实现LeetCode(180.连续的数字)

    [LeetCode] 180.Consecutive Numbers 连续的数字

    Write a SQL query to find all numbers that appear at least three times consecutively.

    +----+-----+
    | Id | Num |
    +----+-----+
    | 1  |  1  |
    | 2  |  1  |
    | 3  |  1  |
    | 4  |  2  |
    | 5  |  1  |
    | 6  |  2  |
    | 7  |  2  |
    +----+-----+

    For example, given the above Logs table, 1 is the only number that appears consecutively for at least three times.

    这道题给了我们一个Logs表,让我们找Num列中连续出现相同数字三次的数字,那么由于需要找三次相同数字,所以我们需要建立三个表的实例,我们可以用l1分别和l2, l3内交,l1和l2的Id下一个位置比,l1和l3的下两个位置比,然后将Num都相同的数字返回即可:

    解法一:

    SELECT DISTINCT l1.Num FROM Logs l1
    JOIN Logs l2 ON l1.Id = l2.Id - 1
    JOIN Logs l3 ON l1.Id = l3.Id - 2
    WHERE l1.Num = l2.Num AND l2.Num = l3.Num;

    下面这种方法没用用到Join,而是直接在三个表的实例中查找,然后把四个条件限定上,就可以返回正确结果了:

    解法二:

    SELECT DISTINCT l1.Num FROM Logs l1, Logs l2, Logs l3
    WHERE l1.Id = l2.Id - 1 AND l2.Id = l3.Id - 1
    AND l1.Num = l2.Num AND l2.Num = l3.Num;

    再来看一种画风截然不同的方法,用到了变量count和pre,分别初始化为0和-1,然后需要注意的是用到了IF语句,MySQL里的IF语句和我们所熟知的其他语言的if不太一样,相当于我们所熟悉的三元操作符a?b:c,若a真返回b,否则返回c。那么我们先来看对于Num列的第一个数字1,pre由于初始化是-1,和当前Num不同,所以此时count赋1,此时给pre赋为1,然后Num列的第二个1进来,此时的pre和Num相同了,count自增1,到Num列的第三个1进来,count增加到了3,此时满足了where条件,t.n >= 3,所以1就被select出来了,以此类推遍历完整个Num就可以得到最终结果:

    解法三:

    SELECT DISTINCT Num FROM (
    SELECT Num, @count := IF(@pre = Num, @count + 1, 1) AS n, @pre := Num
    FROM Logs, (SELECT @count := 0, @pre := -1) AS init
    ) AS t WHERE t.n >= 3;

    参考资料:

    https://leetcode.com/discuss/54463/simple-solution

    https://leetcode.com/discuss/87854/simple-sql-with-join-1484-ms

    https://leetcode.com/discuss/69767/two-solutions-inner-join-and-two-variables

    到此这篇关于SQL实现LeetCode(180.连续的数字)的文章就介绍到这了,更多相关SQL实现连续的数字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • SQL实现LeetCode(196.删除重复邮箱)
    • SQL实现LeetCode(185.系里前三高薪水)
    • SQL实现LeetCode(184.系里最高薪水)
    • SQL实现LeetCode(183.从未下单订购的顾客)
    • SQL实现LeetCode(182.重复的邮箱)
    • SQL实现LeetCode(181.员工挣得比经理多)
    • C++实现LeetCode(179.最大组合数)
    • SQL实现LeetCode(197.上升温度)
    上一篇:Mysql中where与on的区别及何时使用详析
    下一篇:一次mysql迁移的方案与踩坑实战记录
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    SQL实现LeetCode(180.连续的数字) SQL,实现,LeetCode,180.,连续,