我刚刚进入这个名为CodeFights的网站,为开发人员提供了挑战。我想问一下堆栈溢出的可爱的人可能会通过MySql挑战引导我朝着正确的方向前进。 首先它给出了一个描述,如果这个link对你有用,也许你可以帮我解决这个问题,因为输入需要很长时间。
如果不是,我对50%问题的回答很简单: 从book_chapters中选择chapter_name;
它还要求您按照ASCENDING顺序订购章节名称并且我已尝试过 通过chapter_number ASC从book_chapter顺序中选择chapter_name; 但没有运气, 他们只需要book_chapters中的一列及其chapter_name。
有点难过。
答案 0 :(得分:1)
一种方法是将罗马数字转换为阿拉伯语(基数10)表示。
但这并不是必需的。
一系列简单的字符串替换就可以解决问题。
在罗马数字和#34;数字"的排名方面......
I < V < X < L < C < D < M
如果我们更换&#39; L&#39;用&#39; Y&#39;和&#39; C&#39;与&#39; Z&#39;和(现在)我们忽略&#39; D&#39;和&#39; M&#39;然后这个字符串比较将成立:
'I' < 'V' < 'X' < 'Y' < 'Z'
这里的技巧是我们选择特定整理顺序中的替换字符,以便我们可以进行排序。
我们要处理的另一个问题是&#34;减法&#34;的特殊情况。 (向后)替换
IV
IX
XL
XC
如果我们用具有四个重复字符的表示替换这些情况......即IV
- &gt; IIII
,IX
- &gt; VIIII
等等,然后获取可以排序的字符串值。
所以,我们可以使用这样的ORDER BY子句:
ORDER BY REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
UPPER( chapter_num )
,'C','Z')
,'L','Y')
,'IV','IIII')
,'IX','VIIII')
,'XY','XXXX')
,'XZ','YXXXX')
这适用于罗马数字值高达399.当我们遇到“D&#39;”时。
要处理400或更高的数字,我们可以将'D'
替换为字符&#34;大于&#34;整理顺序中的'Z'
,例如左方括号'['
。我们可以使用右方括号'M'
替换']'
。并针对特殊情况'CD'
和'CM'
进行适当的替换。
我们需要验证字符串的整理顺序,这是正确的:
'I' < 'V' < 'X' < 'Y' < 'Z' < '[' < ']'
然后我们可以扩展对超过399的罗马数字的支持......
ORDER BY REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
UPPER( chapter_num )
,'M',']')
,'D','[')
,'C','Z')
,'L','Y')
,'IV','IIII')
,'IX','VIIII')
,'XY','XXXX')
,'XZ','YXXXX')
,'Z[','ZZZZ')
,'Z]','[ZZZZ')