楼主: newkid

[每日一题] PUZZLEUP 2017

[复制链接]
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
241#
发表于 2017-11-23 13:40 | 只看该作者
newkid 发表于 2017-11-22 23:12
上一题我的写法:

我的比你第一个还快
SQL> WITH d AS (
  2  SELECT LEVEL n1, 99999-LEVEL n2, LEVEL||(99999-LEVEL) s, TO_CHAR(LEVEL*(99999-LEVEL)) s2
  3    FROM DUAL
  4  CONNECT BY LEVEL<99999/2
  5  )
  6  SELECT n1,n2,n1*n2
  7    FROM d LEFT JOIN (SELECT TO_CHAR(LEVEL-1) c FROM DUAL CONNECT BY LEVEL<=10) ON INSTR(s,c)=0 OR INSTR(s2,c)=0
  8  WHERE c IS NULL;

        N1         N2      N1*N2
---------- ---------- ----------
     47931      52068 2495671308

已用时间:  00: 00: 00.84
SQL> /

        N1         N2      N1*N2
---------- ---------- ----------
     47931      52068 2495671308

已用时间:  00: 00: 00.84
SQL> /

        N1         N2      N1*N2
---------- ---------- ----------
     47931      52068 2495671308

已用时间:  00: 00: 00.84
SQL> with t as(select level l from dual connect by level<99999/2),
  2  b as(select level-1 b from dual connect by level<=10)
  3  select l,(99999-l) l2,l*(99999-l) p from t
  4  where not exists(select 1 from b where instr(l*(99999-l),b)=0)
  5  and not exists(select 1 from b where instr(l||(99999-l),b)=0);

         L         L2          P
---------- ---------- ----------
     47931      52068 2495671308

已用时间:  00: 00: 00.59
SQL> /

         L         L2          P
---------- ---------- ----------
     47931      52068 2495671308

已用时间:  00: 00: 00.61
SQL> /

         L         L2          P
---------- ---------- ----------
     47931      52068 2495671308

已用时间:  00: 00: 00.60

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
242#
发表于 2017-11-23 13:47 | 只看该作者
〇〇 发表于 2017-11-23 13:40
我的比你第一个还快
SQL> WITH d AS (
  2  SELECT LEVEL n1, 99999-LEVEL n2, LEVEL||(99999-LEVEL) s ...

把2个not exists合并还能快
不过都比不上第2个
SQL> WITH d AS (
  2  SELECT LEVEL n1, 99999-LEVEL n2, LEVEL||(99999-LEVEL) s, TO_CHAR(LEVEL*(99999-LEVEL)) s2
  3    FROM DUAL
  4  CONNECT BY LEVEL<99999/2
  5  )
  6  SELECT n1,n2,n1*n2
  7    FROM d
  8  WHERE INSTR(s2,'0')>0
  9       AND INSTR(s2,'1')>0
10       AND INSTR(s2,'2')>0
11       AND INSTR(s2,'3')>0
12       AND INSTR(s2,'4')>0
13       AND INSTR(s2,'5')>0
14       AND INSTR(s2,'6')>0
15       AND INSTR(s2,'7')>0
16       AND INSTR(s2,'8')>0
17       AND INSTR(s2,'9')>0
18       AND INSTR(s,'0')>0
19       AND INSTR(s,'1')>0
20       AND INSTR(s,'2')>0
21       AND INSTR(s,'3')>0
22       AND INSTR(s,'4')>0
23       AND INSTR(s,'5')>0
24       AND INSTR(s,'6')>0
25       AND INSTR(s,'7')>0
26       AND INSTR(s,'8')>0
27       AND INSTR(s,'9')>0
28  ;

        N1         N2      N1*N2
---------- ---------- ----------
     47931      52068 2495671308

已用时间:  00: 00: 00.14
SQL> with t as(select level l,99999-level l2 from dual connect by level<99999/2),
  2  b as(select level-1 b from dual connect by level<=10)
  3  select l, l2,l*l2 p from t
  4  where not exists(select 1 from b where instr(l*l2,b)=0 or instr(l||l2,b)=0);

         L         L2          P
---------- ---------- ----------
     47931      52068 2495671308

已用时间:  00: 00: 00.39

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
243#
发表于 2017-11-23 14:52 | 只看该作者
15#

SQL>
SQL> with t as
  2   (select level - 1 n from dual connect by level <= 10),
  3  s(lvl,num) as
  4   (select 1, cast(n as varchar2(10))
  5      from t
  6    union all
  7    select lvl + 1, s.num || t.n
  8      from s, t
  9     where s.lvl < 5
10       and instr(s.num, t.n) = 0
11       and instr(s.num, 9 - t.n) = 0)
12  select num, 99999 - num
13    from s
14   where lvl = 5
15     and instr(num * (99999 - num), '0') > 0
16     and instr(num * (99999 - num), '1') > 0
17     and instr(num * (99999 - num), '2') > 0
18     and instr(num * (99999 - num), '3') > 0
19     and instr(num * (99999 - num), '4') > 0
20     and instr(num * (99999 - num), '5') > 0
21     and instr(num * (99999 - num), '6') > 0
22     and instr(num * (99999 - num), '7') > 0
23     and instr(num * (99999 - num), '9') > 0
24  /
NUM                                                                               99999-NUM
-------------------------------------------------------------------------------- ----------
47931                                                                                 52068
52068                                                                                 47931
Executed in 0.062 seconds

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
244#
发表于 2017-11-23 15:02 | 只看该作者

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
245#
 楼主| 发表于 2017-11-23 22:36 | 只看该作者
solomon_007 发表于 2017-11-23 12:32
16#

create table t_triangle_valid as

这个用SPATIAL的方法倒是比较新奇。
但是DIY也不难,这有个线段交叉判断的算法:
https://segmentfault.com/a/1190000004457595
等我写出来和你对答案。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
246#
 楼主| 发表于 2017-11-23 22:38 | 只看该作者

你这个and instr(s.num, 9 - t.n) = 0) 有点说不通,题目并没有说这两个数之间不能有共同的位,甚至都没有说同一个数不能出现重复数字,尽管结果确是如此。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
247#
 楼主| 发表于 2017-11-24 00:20 | 只看该作者
solomon_007 发表于 2017-11-23 12:35
SQL>
SQL> col triangle1 format a10
SQL>  col triangle2 format a10

你忘记除以2了,我的答案是178。
等大神来对答案。

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
248#
发表于 2017-11-24 08:40 | 只看该作者
newkid 发表于 2017-11-23 22:38
你这个and instr(s.num, 9 - t.n) = 0) 有点说不通,题目并没有说这两个数之间不能有共同的位,甚至都没 ...

两个数之和为99999,所以这两个数只能都是5位数,如果不是,至少大的数位数为6,那不用求和都大于99999了; 两个5为数之和为99999,又因为不同的两个个位数最大之和为17(8+9),所以个位最大为7,再加一个1
的进位,那最多也只能达到8,不能为9,所以99999的每一位的值,只能取自(0,9),(1,8),(2,7),(3,6),(4,5); 当一个数的某一位取了其中之一的数,配对中的另一个数就属于另一个数,所以这个配对中的数不能同时出现在一个数中,这就是我加and instr(s.num, 9 - t.n) = 0) 这个条件的原因

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
249#
发表于 2017-11-24 08:46 | 只看该作者
newkid 发表于 2017-11-24 00:20
你忘记除以2了,我的答案是178。
等大神来对答案。

是的, 要除以2才是的,每一对,反着也有一对!

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
250#
发表于 2017-11-24 08:50 | 只看该作者
solomon_007 发表于 2017-11-24 08:40
两个数之和为99999,所以这两个数只能都是5位数,如果不是,至少大的数位数为6,那不用求和都大于99999了 ...

是的,小数还必须>11111,因为11111*88888是9位数

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表