一亩三分地

 找回密码 注册账号

扫描二维码登录本站

BBS
Offer多多
Salarytics
交友
Learn
Who's Hiring?
Visa Tracker
疫情动态
指尖新闻
Instant
客户端
微信公众号
扫码关注公众号
留学申请公众号
扫码关注留学申请公众号
Youtube频道
留学博客
关于我们
查看: 1444|回复: 16
收起左侧

[Leetcode] 几道变态的SQL面试题

[复制链接] |只看干货 |刷题, leetcode
我的人缘0

升级   50%


分享帖子到朋友圈
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   92% (1337)
 
 
7% (107)    👎

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?注册账号

x
本帖最后由 李浩泉 于 2020-9-7 08:43 编辑

# 2881 Roman to Integer by SQL

请大家试试用SQL做一下,答案我加密了,有需要的可以看


Table: book_chapters

chapter_name        chapter_number
A Dead Man        LVI
Behaviour in General        I
Cast Up        XLIX
Imitation        IX
Nemesis        L
Paste        XXIII
The Cub        XXI
The Oxenham Arms        XXIV
Two Bequests        XLVII

Output: (用数字排序所有书名 ASC) 问题的核心是在SQL里完成罗马字母和数字的转换,然后才能排序。

chapter_name
Behaviour in General
Imitation
The Cub
Paste
The Oxenham Arms
Two Bequests
Cast Up
Nemesis
A Dead Man




评分

参与人数 1大米 +1 收起 理由
阿松XFAW + 1 给你点个赞!

查看全部评分


上一篇:关于链表题dummy head的问题。
下一篇:Leetcode一问
我的人缘0

升级   15.86%

chenwang9527 2020-9-7 14:16:53 | 显示全部楼层
本楼: 👍   100% (4)
 
 
0% (0)   👎
全局: 👍   100% (235)
 
 
0% (0)    👎
李浩泉 发表于 2020-9-7 08:39
现在让你用SQL写,怎么办?这才是真正DE应该考得,SQL算法,而不是SQL + 算法。

SQL的源程序下面加密了 ...

老哥对DE面试为啥想法有点偏激。。。DE这个东西本来就是方方面面都涉及到的。。。SQL是很重要但并不是所有公司都是SQL heavy的。。。编程,数据模型,product sense,info structure 都是有用到的。。。真的是看公司平时用什么人家考什么的。。。。
亚麻喜欢考SQL是因为他们不同team真正通用的只有红屎。。。不同team会用到不同的工具做data pipeline的。。。
脸熟要考SQL+python也是因为他们data engineer team用到的是脸熟SDE用PYTHON专门给内部开发的类airflow平台。而脸熟的DE是比较少自己开发operator和自己的function的。
骨骼不大熟悉,但是据我所知 骨骼DE极少,大部分data pipeline都是由偏DATA INFO STRUCTURE 的SDE完成的。。剩下的由各种analyst或者BIE拿数据。
我虽然经验不是很多,但是面试过很多公司和很多业内的人也都讨论过,可能是我级别不够,但是面试角度来说考这么极端难度的SQL是其实非常不常见的。。。。
个人浅见 非喜勿喷。

评分

参与人数 2大米 +4 收起 理由
14417335 + 3
我不爱记单词 + 1 谢谢分享!

查看全部评分

回复

使用道具 举报

我的人缘0

升级   81.05%

magicsets 2020-9-7 10:53:46 | 显示全部楼层
本楼: 👍   100% (4)
 
 
0% (0)   👎
全局: 👍   99% (1208)
 
 
0% (8)    👎
http://sqlfiddle.com/#!17/f65f2/24

[SQL] 纯文本查看 复制代码
WITH
  RomanSymbols AS (
    SELECT
      UNNEST(ARRAY['I', 'V', 'X', 'L', 'C', 'D', 'M']) AS roman,
      UNNEST(ARRAY[1, 5, 10, 50, 100, 500, 1000]) AS number
  ),
  BookChaptersWithIds As (
    SELECT
      chapter_name, chapter_number,
      ROW_NUMBER() OVER () AS chapter_id
    FROM
      BookChapters
  ),
  TranslatedInput AS (
    SELECT
      chapter_id, subscript, number
    FROM
      (
        SELECT
          chapter_id, subscript,
          SUBSTRING(chapter_number, subscript, 1) AS roman
        FROM
          BookChaptersWithIds,
          GENERATE_SERIES(1, LENGTH(chapter_number)) AS subscript
      ) t
      JOIN RomanSymbols s ON t.roman = s.roman
  ),
  TranslatedChapterNumbers AS (
    SELECT
      l.chapter_id,
      SUM(CASE WHEN l.number >= COALESCE(r.number, 0) 
               THEN l.number ELSE -l.number
          END) AS chapter_number
    FROM
      TranslatedInput l
      LEFT JOIN TranslatedInput r ON l.chapter_id = r.chapter_id AND
                                     l.subscript + 1 = r.subscript
    GROUP BY l.chapter_id
  )
SELECT
  chapter_name
FROM
  BookChaptersWithIds s
  JOIN TranslatedChapterNumbers t ON s.chapter_id = t.chapter_id
ORDER BY t.chapter_number;

评分

参与人数 2大米 +7 收起 理由
14417335 + 5
李浩泉 + 2 高手在哪工作啊?

查看全部评分

回复

使用道具 举报

我的人缘0

升级   50%

 楼主| 李浩泉 2020-9-7 08:39:29 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   92% (1337)
 
 
7% (107)    👎
本帖最后由 李浩泉 于 2020-9-7 08:42 编辑

现在让你用SQL写,怎么办?这才是真正DE应该考得,SQL算法,而不是SQL + 算法。

SQL的源程序下面加密了,有兴趣的自己先试试看,能不能过这道DE面试题:

用PYTHON,将罗马数字转化为阿拉伯数字,很简单,代码如下:
[Python] 纯文本查看 复制代码
dic = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
        n = len(s) 
        a = dic[s[n-1]]  
        
        while n > 1 :
            if dic[s[n-2]] >= dic[s[n-1]] :
                a = dic[s[n-2]] + a
                n -= 1
            else :
                a = a - dic[s[n-2]]
                n -= 1
        return a



回复

使用道具 举报

我的人缘0

升级   50%

 楼主| 李浩泉 2020-9-7 08:40:25 | 显示全部楼层
本帖为密码帖 ,请输入密码 
回复

使用道具 举报

我的人缘0

升级   2.86%

本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   99% (708)
 
 
0% (2)    👎
新建一个table是罗马数字和数字的对应,然后再left join 再order by是不是就行了?

评分

参与人数 1大米 +1 收起 理由
李浩泉 + 1 你把我逗乐了,HARD CODE手写吗?

查看全部评分

回复

使用道具 举报

我的人缘0

升级   50%

 楼主| 李浩泉 2020-9-7 08:59:00 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   92% (1337)
 
 
7% (107)    👎
本帖最后由 李浩泉 于 2020-9-7 09:01 编辑

# 1747 - Set weekly alarm_date to trigger the ETL till the end of year (这道简单一些,medium)

alarm_date
------------
2020-09-07
2020-09-14
2020-09-21
2020-09-28
2020-10-05
2020-10-12
2020-10-19
2020-10-26
2020-11-02
2020-11-09
2020-11-16
2020-11-23
2020-11-30
2020-12-07
2020-12-14
2020-12-21
2020-12-28

[SQL] 纯文本查看 复制代码
WITH RECURSIVE CTE (alarm_date) AS 
(
    SELECT CURRENT_DATE AS alarm_date 
    UNION ALL
    SELECT alarm_date + 7 FROM CTE
    WHERE EXTRACT(YEAR FROM alarm_date + 7) = EXTRACT(YEAR FROM alarm_date) AND EXTRACT(MONTH FROM alarm_date + 7) <= 12 
) 

SELECT * FROM CTE


回复

使用道具 举报

我的人缘0

升级   50%

 楼主| 李浩泉 2020-9-7 09:00:21 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   92% (1337)
 
 
7% (107)    👎
Vincentw 发表于 2020-9-7 08:57
新建一个table是罗马数字和数字的对应,然后再left join 再order by是不是就行了?
你把我逗乐了,HARD CODE手写吗?
回复

使用道具 举报

我的人缘0

升级   2.86%

本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   99% (708)
 
 
0% (2)    👎
李浩泉 发表于 2020-09-06 18:00:21
你把我逗乐了,HARD CODE手写吗?
CASE WHEN THEN END AS Num
回复

使用道具 举报

我的人缘0

升级   50%

 楼主| 李浩泉 2020-9-7 10:49:29 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   92% (1337)
 
 
7% (107)    👎
Vincentw 发表于 2020-9-7 09:07
CASE WHEN THEN END AS Num

从1到999,你都要手写吗?写1000个case when?2000怎么办?
回复

使用道具 举报

我的人缘0

升级   50%

 楼主| 李浩泉 2020-9-7 11:16:55 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   92% (1337)
 
 
7% (107)    👎
本帖最后由 李浩泉 于 2020-9-7 11:18 编辑

这位高手贡献了PostgreSQL的程序,那我就写个MySQL的给大家参考:
大家自己也试试,看看电面的时候能不能过的了这道SQL题。


[SQL] 纯文本查看 复制代码
SELECT 
        chapter_name
    FROM 
        (SELECT 
             chapter_name,
             IF(LOCATE('IV',chapter_number) > 0, 4, 0) + 
             IF(LOCATE('IX',chapter_number) > 0, 9, 0) + 
             IF(LOCATE('XL',chapter_number) > 0, 40, 0) + 
             IF(LOCATE('XC',chapter_number) > 0, 90, 0) + 
             IF(LOCATE('CD',chapter_number) > 0, 400, 0) + 
             IF(LOCATE('CM',chapter_number) > 0, 900, 0) as num,
             REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(chapter_number, 
                 'IV', ''), 'IX', ''), 'XL', ''), 'XC', ''), 'CD', ''), 'CM', '') as chapter_number
        FROM book_chapters ) e
        
    ORDER BY        num +
        (CHAR_LENGTH(chapter_number) - CHAR_LENGTH(REPLACE(chapter_number, 'I', ''))) * 1 +
        (CHAR_LENGTH(chapter_number) - CHAR_LENGTH(REPLACE(chapter_number, 'V', ''))) * 5 +
        (CHAR_LENGTH(chapter_number) - CHAR_LENGTH(REPLACE(chapter_number, 'X', ''))) * 10 +
        (CHAR_LENGTH(chapter_number) - CHAR_LENGTH(REPLACE(chapter_number, 'L', ''))) * 50 +
        (CHAR_LENGTH(chapter_number) - CHAR_LENGTH(REPLACE(chapter_number, 'C', ''))) * 100 +
        (CHAR_LENGTH(chapter_number) - CHAR_LENGTH(REPLACE(chapter_number, 'D', ''))) * 500 +
        (CHAR_LENGTH(chapter_number) - CHAR_LENGTH(REPLACE(chapter_number, 'M', ''))) * 1000

评分

参与人数 1大米 +5 收起 理由
14417335 + 5

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

隐私提醒:
■拉群请前往同学同事飞友|拉群结伴版块,其他版块拉群,帖子会被自动删除
■论坛不能删帖,为防止被骚扰甚至人肉,不要公开留微信等联系方式,请以论坛私信方式发送。
■特定版块可以超级匿名:https://pay.1point3acres.com/tools/thread
■其他版块匿名方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

手机版|||一亩三分地

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

Some icons made by Freepik from flaticon.com

快速回复 返回顶部 返回列表