精华内容
下载资源
问答
  • 一天中各时段的划分

    千次阅读 2012-02-03 13:58:43
    一天中各时段的划分 ----------------------------------------------- 凌晨:01:00:00----04:59:59 早上:05:00:00----07:59:59 上午:08:00:00----10:59:59 ...

    一天中各时段的划分

    -----------------------------------------------
                                                 
    凌晨:01:00:00----04:59:59                   

    早上:05:00:00----07:59:59

    上午:08:00:00----10:59:59

    中午:11:00:00----12:59:59

    下午:13:00:00----16:59:59

    傍晚:17:00:00----18:59:59

    晚上:19:00:00----22:59:59

    子夜:23:00:00----00:59:59

    -----------------------------------------------

    23:00:00----24:59:59-----------子时(属水)

    01:00:00----02:59:59-----------丑时(属土)

    03:00:00----04:59:59-----------寅时(属木)

    05:00:00----06:59:59-----------卯时(属木)

    07:00:00----08:59:59-----------辰时(属土)

    09:00:00----10:59:59-----------巳时(属火)

    11:00:00----12:59:59-----------午时(属火)

    13:00:00----14:59:59-----------未时(属土)

    15:00:00----16:59:59-----------申时(属金)

    17:00:00----18:59:59-----------酉时(属金)

    19:00:00----20:59:59-----------戊时(属土)

    21:00:00----22:59:59-----------亥时(属水)

    -----------------------------------------------

    展开全文
  • 按天生成日志并以时间点为准,午夜12:00即会自动将前一天的日志重命名为".YYYY-MM-DD"形式,并生成新的今天的日志文件 @而我实践的结果是 只有今天再写入该日志的时候才会重命名前一天的日志,并生成今天的...
  • ![转换前](https://img-ask.csdn.net/upload/201509/25/1443171467_472728.png) ![转换后](https://img-ask.csdn.net/upload/201509/25/1443171635_685550.png)...我不想用case when 因为现在我写的sql已经很长了。。。
  • Oracle分区详解,分区创建,分区按日期划分

    万次阅读 多人点赞 2019-05-26 19:41:09
    最近接手个项目,要求与Oracle数据库做对接,分区还是要做的,可是网上根本涉及内容很少,没办法,用下午才弄明白,截至发稿,饭都没吃呢。。。。。。。。 分区概念: 正常增删改查都行,SQL语句正常写,...

    前言(絮叨絮叨)

    最近接手一个项目,要求与Oracle数据库做对接,分区表还是要做的,可是网上根本涉及内容很少,没办法,用一下午才弄明白,截至发稿,饭都没吃呢。。。。。。。。

    分区表概念:

    正常增删改查都行,SQL语句正常写,但是查询可以通过分区表进行区分查询,可以限定范围什么的,特别方便,而且快,不絮叨,直接说主题。

    分区表创建

    先说下,里面有两个地方需要注意,一个是分区字段名,这里用的是:WORKDATE,需要有个分区字段;
    另外一个是划分分区时间的 less than(XXXX),这个时间是比较特殊,超过这个时间会自动创建额外的分区,但暂时这么理解吧,我一般管它叫默认时间,也可以创建多个,但是我都只创建一个,后续会自增。
    月的,年的建议设置时间为每个月的01月1日。

    创建日分区表

    create table TTT(WORKDATE date)
    PARTITION BY RANGE (WORKDATE) INTERVAL (NUMTODSINTERVAL(1,'day'))
    (    partition P_1995 values less than (TO_DATE('1995-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));
    

    创建月分区表

    create table TTT(WORKDATE date)
    PARTITION BY RANGE (WORKDATE) INTERVAL (NUMTOYMINTERVAL(1,'month'))
    (    partition P_1995 values less than (TO_DATE('1995-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));
    

    创建年分区表

    create table TTT(WORKDATE date)
    PARTITION BY RANGE (WORKDATE) INTERVAL (NUMTOYMINTERVAL(1,'year'))
    (    partition P_1995 values less than (TO_DATE('1995-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));
    

    报错信息解决:

    报错:
    ORA-14752: 间隔表达式不是正确类型的常数

    解决:你写错了,日和周的是 NUMTODSINTERVAL,年的和月的 是 NUMTOYMINTERVAL
    在这里插入图片描述

    报错
    ORA-14767: 无法使用现有上限指定此间隔

    解决:你时间写的不对,时间不可以超过指定时间
    月不超过 28号
    年不能超过31号

    在这里插入图片描述

    问题:

    **为什么我创建的都是第二天的分区表?

    需求:我想建分区表时候,插一条数据是创建当前时间的分区

    对于日频度的来说:

    默认日期建议是,是 TO_DATE(‘1995-01-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’),在这个时间里就会创建当天的分区,超过会创建下一天的分区。

    (    partition P_1995 values less than (TO_DATE('1995-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));
    

    对于月频度的来说:

    1号最好

    (    partition P_1995 values less than (TO_DATE('1995-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));
    

    对于年频度的来说

    1号最好

    (    partition P_1995 values less than (TO_DATE('1995-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));
    

    如果给你提供到了帮助,评论下,点个关注,给个赞。

    展开全文
  • 从世界需要统一时间标准出发,讲述为什么引入时区、时区的设计,进一步介绍时间的测量;涉及概念包括:世界时、本地时、原子时,time zone/UT/GMT/UTC/TAI等; 顺带介绍数据库时间、UNIX时间

    看完本文,您将了解为什么会有时区、时区为什么这么设计,以及时间是如何测量、统一的。

    只想了解概念的朋友,直接走传送门:时区GMTUTTAIUTCUNIX时间戳UNIX 2038问题

    MySQL中的时区、日期和时间处理,参见《MySQL日期与时间函数(日期/时间格式化、增减、对比、时区等)》

    时区

    为什么需要时区

    世界各地的时间是“不一样”的

    古人的一天,习惯用日升日落来计算,比如太阳最高就是正午(12时):这就是地方时。
    这是千百年来形成的一种习惯和文化。
    而地球自转的原因,不同地区阳光照射的角度不同,因此地方时是不同的。

    地球自转是自西向东的,所以东边比西边先看到太阳。因为上面的地方时特点,同一客观时刻,东边使用的时间也比西边的早。

    所以客观上同一时刻,从不同地区人的意识和表达上,时间是不同的。

    全世界需要一个统一的时间标准

    随着地区、国家的形成、全球化的推进,不同地方时的人之间有更多的交流。但不同的时间表达,给记录、沟通带来了混乱。
    所以世界需要一种统一的时间标准。

    最简单的方式,选一个某一个地区的地方时作为时间标准。但这样一来,当这个地区处于正午时、假定是12点,在地球其他经度上,人们可能正处于早晨、深夜、傍晚。人们的表达可能会变成,“12点了,要吃早饭了”、“12点了、要吃晚饭了”,这严重违背了人们千百年形成的习惯,完全没办法接受。

    所以在兼顾人们习惯的同时,还要有一个可以协调一致的方案,让大家各自表达各自时间的同时,客观上的时间可以对应上。

    时区就是为了解决了这个问题而出现。

    时区的设计

    时区的设计,既要统一世界的时间,也要兼顾各地区习惯、不同地区还要容易换算。

    时区划分规则

    1884年,在华盛顿的国际经度会议规定:将全球按经线从东到西划分为24个时区,其中东、西各12个时区,每个时区跨越经度15°,0区和12区跨越东西各7.5°)。规定相邻区域的时间相差1小时(这样24个时区刚好是24小时,地球自转一周),这代表着在同一区域内的东端和西端的人看到太阳升起的时间最多相差不过1小时。

    当人们跨过一个区域,就将自己的时钟校正1小时(向西减1小时,向东加1小时),跨过几个区域就加或减几小时。这样使用起来就很方便。
    但这个方法也有个问题:如果连续跨越24个时区回到原点,那么时间将会多出或少去一天。
    为了避免这种“日期错乱”现象,国际上统一规定180°经线为“国际日期变更线”。当你由西向东跨越国际日期变更线时,必须在你的计时系统中减去一天;反之,由东向西跨越国际日期变更线,就必须加上一天
    在这里插入图片描述
    图片来自香港天文台1
    百度的时区图片,更详细,但有防盗链不能引用。

    上面的标准是指导意义,而各地实际遵照的时区,并不一定严格对照所处经度。因为有很多国家或地区同时跨越多个时区,为了照顾到行政上的方便,常将1个国家或1个省份划在一起时区里。所以时区并不严格按南北直线来划分,而是按自然条件来划分。例如,中国幅员宽广,差不多跨5个时区,但为了使用方便简单,实际上在只用东八时区的标准时即北京时间为准。

    第一个世界时:GMT

    确定时区规则后,会议还规定英国(格林尼治天文台旧址)为零时区。这就诞生了第一个世界时(Universal Time,缩写为UT)格林尼治标准时间(Greenwich Mean Time,缩写为GMT,又称格林尼治平时)
    GMT 12:00就是指格林尼治天文台当地的中午12:00,而GMT+8 12:00,则是指的东八区的北京当地时间的12:00。

    GMT最早只是英国的基准时间。
    格林尼治天文台建于1675年,当时,英国航海事业发展迅速,为了解决在海上测定经度的需要,英国当局决定在伦敦东南郊距市中心约20多千米,泰晤士河畔的皇家格林尼治花园中建立天文台。
    1835年以后,格林尼治天文台在杰出的天文学家埃里的领导下,得到扩充并更新了设备。他首创利用“子午环”测定格林尼治平太阳时。该台成为当时世界上测时手段较先进的天文台。
    19实际上半叶,当时很多国家建立了自己的本初子午线,但随着世界航海事业的发展,各地区同步时间变得很不方便。后来在1884年的的国际精度会议上,决定以通过当时格林尼治天文台埃里中星仪所在的经线,GMT也成为了世界基准时间。
    尽管1884年才确立这个时间系统概念,但实际上1924年开始,格林威治天文台每小时就会向全世界播报时间。此后,GTM由英国伦敦的格林威治皇家天文台计算并维护,并在往后的几十年往欧陆其他国家扩散。

    时间的“长度”和“坐标”

    GMT的时间测量

    在刚开始的几十年,GMT 的测量方法非常简单:观测者随时监控太阳在天空的位置,并且把每天太阳爬升到仰角最高的时候记录下来,这个时间点称呼为“过中天”。一般人对于一天 24 小时的理解,大致上就相等于两次太阳过中天的时间间隔。

    但由于地球是以椭圆轨道绕着太阳,在轨道上的行进速率不一,导致一年之中会有“比较长的一天”与“比较短的一天”,所以格林威治的观测者必须要至少连续观测一年,然后求取 365 个长度不一的“天”,再把他们全部平均后,得到固定的一天长度,之后再细分成时、分、秒等单位。
    因为这些特性,实际上GMT是有秒级误差的。

    后来科学家发现了由于地轴摆动、不同地点测量的世界时会有差别,为此制定了新的标准UT1,之前的GMT称之为UT0;再后来科学家发现由于地球自转率的季节性变动,UT1具有周期性变化,修正上述影响后,得到了更均匀的UT2

    国际原子时

    在1960年以前,GMT尽管有些许不精确,但仍作为基本时间计量系统被广泛应用。
    (中间短暂的被历书时代替)
    1967年第十三届国际计量大会(CGPM)决定,把秒的定义改成原子钟导出的原子时秒。

    铯 -133 原子基态的两个超精细能级间在零磁场下跃迁辐射9,192,631,770周所持续的时间

    自此时间测量就与地球自转脱节了。这个只利用原子钟计算时间与日期的系统,称作国际原子时 (International Atomic Time,简称TAI),这是一种只有“天”的系统,时分秒都以“天”的小数点零头来表示。
    国际原子时是一个连续性指标, 由1958年1月1日0時0分0秒起,以日、时、分、秒计算,准确度为每日数纳秒,而UT的准确度为每日数毫秒。在确定原子时起点之后,由于地球自转速度不均匀,UT与原子时之间的时差便逐年积累。

    TAI的起点是这样规定的:
    取1958年1月1日0时0分0秒世界时(UT)的瞬间作为同年同月同日0时0分0秒TAI。(事后发现,在该瞬间原子时与世界时的时刻之差为0.0039秒。这一差值就作为历史事实而保留下来。

    UTC

    尽管获得了更精确的时间测量,但许多应用部门要求时间系统接近世界时。
    既要以国际原子时为计算基准,但时间又要尽量接近UT、让一般人都方便使用,UTC就是为了这个目标而设计。

    诞生

    1972年诞生了一个折衷方案:协调世界时(Universal Time Coordinated,缩写为UTC)1 2UTC是当前的世界标准时间

    协调世界时,即以我为基准,向我看齐的意思。(英语:Coordinated Universal Time,法语:Temps Universel Coordonné,简称UTC)是最主要的世界时间标准,由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。
    中国大陆采用ISO 8601的《数据元和交换格式信息交换日期和时间表示法》(GB/T 7408-1994)称之为国际协调时间,代替原来的GB/T 7408-1994;中国台湾采用CNS 7648的《资料元及交换格式–资讯交换–日期及时间的表示法》,称之为世界统一时间

    为了确保UTC与GMT相差不会超过0.9秒,在有需要的情况下会在UTC内加上正或负闰秒。所以,UTC与GMT基本上等同,误差不超过0.9秒。所以在实际上,UTC与GMT近乎相同。

    • 按国际无线电咨询委员会(CCIR)通过的关于UTC的修正案,从1972年1月1日起UTC与UT1(在UT中加入极移改正得到)之间的差值最大可以达到±0.9s。位于巴黎的国际地球自转事务中央局负责决定何时加入闰秒。一般会在每年的6月30日、12月31日的最后一秒进行调整。
    • UTC与TAI之间会出现若干整数秒的差别,但两者频率保持一致。

    这样UTC按原子时的频率、保持了时间尺度的均匀性,又能近似地反映地球自转的变化。

    由于 UTC直接与国际度量衡标准相联系,所以目前所有的国际通讯系统,像是卫星、航空、GPS 等等,全部都协议采用UTC 时间。

    随着UTC的诞生,之前的各种计时方案使用越来越少。尽管如此,GMT等世界时,在日常生活、天文导航、大地测量和宇宙飞行等方面仍属必需;同时,世界时反映地球自转速率的变化,是地球自转参数之一,仍为天文学和地球物理学的基本资料。

    格式

    国际标准化组织规定了日期和时间的表示方法,ISO 8601规定了日期和时间相关的数据交换时的格式。UTC的标准格式为2019-11-11T00:00:00.000Z,由三个部分组成:

    1. T代表使用UTC时间
    2. Z是UTC偏移量,表示UTC时间与本地时的差别、即时差。
      • Z本身表示0时区,读作Zulu。写作Z或不写的时候,表示不偏移、即GTM/0时区的时间。
      • 需要偏移时,将Z替换为真实的偏移量。偏移量可用以下形式表示: ±[hh]:[mm]±[hh][mm]±[hh]
      • 目前有39个UTC偏移量(当伊朗试行夏令时时只有38个)
      • 偏移量除了数字,也可以写时区名
    3. 时间数值。表示在限定UTC格式和偏移量的情况下,偏移时区的本地时间。

    看一个例子:

    • GMT时间无需偏移,写作2019-11-11T00:00:00.000
    • 北京在东8区、比GMT要早8小时,写作2019-11-11T08:00:00.000+0800

    计算机世界的时间:UNIX TIME

    定义

    Unix时间(Unix Time),也叫做POSIX时间或纪元时间(Epoch Time),是用来记录时间的流逝,所以也常被叫做时间戳3 4
    定义为从1970-01-01T00:00:00开始流逝的秒数,不考虑闰秒。之后的时间是正数,之前的是负数。

    从定义可以看到,它只代表了从Unix纪元开始流逝的秒数,所以你身处地球上何处,这个时间都是一样的。

    一般Unix时间都是精确到秒,但也有些地方Unix时间是精确到毫秒的(比如MySQL 5.6.4之后开始支持到微秒)。

    使用场景

    Unix时间主要用于Unix或类Unix系统,但在文件系统、数据库系统、开发语言等方面也有广泛应用,如C/C++、Java、MySQL等。也存在一些其他操作系统或者编程语言,使用的就是不一样的纪元起始日期了,比如MFC使用的是1899-12-30T00:00:00

    Unix系统中计算机内部的时间都是使用Unix时间的。而给用户看时,就需要转换成日期和时间的这种对人友好的形式。

    在类Unix系统上,可通过命令date +%s查看当前Unix时间:
    1490451854

    几点疑问

    为什么Unix纪元时间是1970-01-01T00:00:00

    这个问题得去问Unix之父:Ken Thompson 和 Dennis Ritchie了,是他们选择这个时间作为Unix系统的纪元时间的4

    第一版的Unix程序员手册是1971年11月份出版的,上面定义Unix时间是“从1971-01-01T00:00:00开始,单位是一秒的六十分之一”。这意味在Unix时间的最早版本中,时间计数器以60Hz的频率(芯片的振荡器频率)递增,每隔1/60秒,计数器就加一。当时使用的整数计数器是32位的,这样Unix时间能够表示的范围就非常受限了,232/60/3600/24/30/12≈2.3年。所以后来经过多次更改,频率变成了1Hz,纪元时间改为了1970-01-01T00:00:00

    有一种说法是Unix操作系统诞生于1970年,但实际上并不是的,在1969年左右,Unix的概念就已经诞生了,Unix的最早版本已经诞生了。Wired网站上的一篇文章写道

    Ritchie说这个时间其实是随意选择的,因为需要一个统一的日期来作为时间的起点,而1970年的元旦,看起来是最方便的。

    时间戳存满了怎么办?

    目前已知操作系统、文件系统、数据库系统、开发语言等,都可能因使用或借鉴了Unix,存在类似问题。

    在32位系统中一般时间戳占用4字节,还有一些系统如MySQL也如此。
    32位、去除符号位,剩余位数最多表示2^31-1=2147483647秒≈24855天≈68年,有人计算过是2038-01-19T03:14:07。到了那个时刻,时间戳字段存满就会溢出;如果在那个时候,目前大多数系统或语言还没有修改时间戳的长度,计算机世界的世界末日就来了!5

    对于操作系统而言,目前我们大部分的系统都已经升级到64位系统,理论上可以一直表达到15:30:08 UTC on Sun, 4 December 292,277,026,596,也就是几千亿年后。可惜太阳系几十亿年后就要毁灭了,人类不一定能见到那个时刻;要是人类幸存下来了,应该有的是办法解决这个问题了。

    是否会发生2038年问题,并不绝对取决于是32位系统还是64位系统。而是由具体系统中对time_t类型的实现决定。NetBSDOpenBSD的早期版本在amd64平台上仍然使用了32位time_t,因此仍然会发生2038年问题。如今也有一些32位系统开始使用64位的time_t类型。64位Linux上已经在使用64位的time_t了,而32位Linux上则似乎仍然是32位。Mac OS也已经不用担心2038问题,亲测1万年以上没问题。
    除了操作系统,开发语言或数据库系统,有些不一定依赖于系统的time_t,是否已解决了2038问题,要看其支持情况。目前Java是没有该问题的,MySQL 8.0timstamp还有该问题。

    要想知道你的电脑不幸到2038年还没坏,会不会遇上末日,可以用下面的方法尝试:

    在GNU/Linux上执行date -ud @2147483648
    在BSD上执行date -u -r 2147483648

    如果系统使用了64位时间,结果应该是Tue Jan 19 03:14:08 UTC 2038,即超出32位时间戳最大值1秒。这样就可以度过末日了。

    UNIX这块,本人对计算机历史、系统原理了解有限,大量参考了http://ju.outofmemory.cn/entry/95734这篇文章。原文还有很多扩展,感兴趣的朋友可以去读一下。


    在这里插入图片描述


    以上。感谢您的阅读。

    本文未尽事项,后续有机会补充

    • 时区名
    • ISO8601的详细解读
    • UNIX时间戳的限制,广泛存在于多种计算机系统中,具体的区别、改造情况有哪些

    1. 香港天文台 - 世界时区图:http://gb.weather.gov.hk/gts/time/clock/clockHc.htm# ↩︎ ↩︎

    2. 百度 - UTC:https://baike.baidu.com/item/%E5%8D%8F%E8%B0%83%E4%B8%96%E7%95%8C%E6%97%B6/787659?fr=aladdin ↩︎

    3. UNIX时间戳 - 百度百科 :https://baike.baidu.com/item/unix%E6%97%B6%E9%97%B4%E6%88%B3/2078227?fr=aladdin ↩︎

    4. UNIX时间 - 维基百科:https://en.wikipedia.org/wiki/Unix_time ↩︎ ↩︎

    5. UNIX时间2038问题:https://en.wikipedia.org/wiki/Year_2038_problem ↩︎

    展开全文
  • 【每日题】 959. 由斜杠划分区域

    万次阅读 2021-01-26 11:00:30
    避免每日太过咸鱼,一天搞定一道LeetCode算法题 一、题目描述 在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。(请注意,反斜杠字符是转义...

    【每日一题】 959. 由斜杠划分区域

    避免每日太过咸鱼,一天搞定一道LeetCode算法题

    一、题目描述

    在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。(请注意,反斜杠字符是转义的,因此 \ 用 “\” 表示。)。

    返回区域的数目。

    提示:

    • 1 <= grid.length == grid[0].length <= 30
    • grid[i][j]'/''\'、或 ' '

    示例 1:

    输入:
    [
      " /",
      "/ "
    ]
    输出:2
    解释:2x2 网格如下:
    

    在这里插入图片描述

    示例 2:

    输入:
    [
      " /",
      "  "
    ]
    输出:1
    解释:2x2 网格如下:
    

    在这里插入图片描述

    示例 3:

    输入:
    [
      "\\/",
      "/\\"
    ]
    输出:4
    解释:(回想一下,因为 \ 字符是转义的,所以 "\\/" 表示 \/,而 "/\\" 表示 /\。)
    2x2 网格如下:
    

    在这里插入图片描述

    示例 4:

    输入:
    [
      "/\\",
      "\\/"
    ]
    输出:5
    解释:(回想一下,因为 \ 字符是转义的,所以 "/\\" 表示 /\,而 "\\/" 表示 \/。)
    2x2 网格如下:
    

    在这里插入图片描述

    示例 5:

    输入:
    [
      "//",
      "/ "
    ]
    输出:3
    解释:2x2 网格如下:
    

    在这里插入图片描述

    二、题解

    1. 解法

    解题思路:

    这是一个关于连通性的问题,让我们求解连通分量的个数,解决这个问题没有特别的技巧,根据题意 画图分析、稍微细心一点就可以通过系统测评。

    可以用深度优先遍历(Depth First Search)、广度优先遍历(Breadth First Search)和并查集(Disjoint Sets),由于只要求计算结果,不要求给出具体的连通信息,可以使用并查集。

    1. 并查集

    「斜杠」、「反斜杠」把单元格拆分成的 2 个三角形的形态,在做合并的时候需要分类讨论。根据「斜杠」、「反斜杠」分割的特点,我们把一个单元格分割成逻辑上的 4 个部分。如下图所示:

    在这里插入图片描述

    我们须要遍历一次输入的二维网格 grid,在 单元格内 和 单元格间 进行合并。

    单元格内:

    如果是空格:合并 0、1、2、3;
    如果是斜杠:合并 0、3,合并 1、2;
    如果是反斜杠:合并 0、1,合并 2、3。
    单元格间:

    把每一个单元格拆分成 4 个小三角形以后,相邻的单元格须要合并,无须分类讨论。我们选择在遍历 grid 的每一个单元格的时候,分别「向右、向下」尝试合并。

    在这里插入图片描述

    向右:合并 1 (当前单元格)和 3(当前单元格右边 1 列的单元格),上图中红色部分;
    向下:合并 2 (当前单元格)和 0(当前单元格下边 1 列的单元格),上图中蓝色部分。
    事实上,大家选择在遍历 grid 的每一个单元格的时候,分别「向左、向上」、「向左、向下」、「向右、向上」、「向右、向下」中的任何一种都可以。

    合并完成以后,并查集里连通分量的个数就是题目要求的区域的个数。

    java代码实现如下:

     public static int regionsBySlashes(String[] grid) {
         int n = grid.length;
         int size = 4 * n * n;
         UnionFind unionFind = new UnionFind(size);
         for (int i = 0; i < n; i++) {
             char[] chars = grid[i].toCharArray();
             for (int j = 0; j < chars.length; j++) {
                 // 二维网格转换为一维表格
                 int index = 4 * (i * n + j);
                 char c = chars[j];
                 // 单元格内合并
                 if (c == '/') {
                     // 合并 0、3,合并 1、2
                     unionFind.union(index, index + 3);
                     unionFind.union(index + 1, index + 2);
                 } else if (c == '\\') {
                     // 合并 0、1,合并 2、3
                     unionFind.union(index, index + 1);
                     unionFind.union(index + 2, index + 3);
                 } else {
                     unionFind.union(index, index + 1);
                     unionFind.union(index + 1, index + 2);
                     unionFind.union(index + 2, index + 3);
                 }
    
                 // 单元格间合并
                 // 向右合并:1(当前)、3(右一列)
                 if (j + 1 < n) {
                     unionFind.union(index + 1, 4 * (i * n + j + 1) + 3);
                 }
                 // 向下合并:2(当前)、0(下一行)
                 if (i + 1 < n) {
                     unionFind.union(index + 2, 4 * ((i + 1) * n + j));
                 }
    
             }
    
    
         }
         return unionFind.getCount();
     }
    
    private static class UnionFind {
    
        private int[] parent;
    
        private int count;
    
        public int getCount() {
            return count;
        }
    
        public UnionFind(int n) {
            this.count = n;
            this.parent = new int[n];
            for (int i = 0; i < n; i++) {
                parent[i] = i;
            }
        }
    
        public int find(int x) {
            return parent[x] == x ? x : (parent[x] = find(parent[x]));
        }
    
        public void union(int x, int y) {
            int rootX = find(x);
            int rootY = find(y);
    
            if (rootX == rootY) {
                return;
            }
            parent[rootX] = rootY;
            count--;
        }
    }
    

    复杂度分析

    • 时间复杂度:O(m⋅α(n)),其中 mm 是数组 connections 的长度,α 是阿克曼函数的反函数。

    • 空间复杂度:O(n),即为并查集需要使用的空间。

    2. 解法二

    做题不是目的,毕竟这道题用并查集做出来也是比较ok的了,但是为了学习更多的算法思想,所以看看大佬们其他的解决方案,了解到了 深度优先搜索 ,接下来我们就是这个试一下吧。使用深度优先搜索来得到图中的连通分量数。

    具体地,初始时所有节点的状态均为「待搜索」。我们每次选择一个「待搜索」的节点,从该节点开始进行深度优先搜索,并将所有搜索到的节点的状态更改为「已搜索」,这样我们就找到了一个连通分量。

    List<Integer>[] edges;
    boolean[] used;
    
    public  int makeConnected2(int n, int[][] connections) {
        if (connections.length < n - 1) {
            return -1;
        }
    
        edges = new List[n];
        for (int i = 0; i < n; ++i) {
            edges[i] = new ArrayList<Integer>();
        }
        for (int[] conn : connections) {
            edges[conn[0]].add(conn[1]);
            edges[conn[1]].add(conn[0]);
        }
    
        used = new boolean[n];
        int ans = 0;
        for (int i = 0; i < n; ++i) {
            if (!used[i]) {
                dfs(i);
                ++ans;
            }
        }
    
        return ans - 1;
    }
    
    public  void dfs(int u) {
        used[u] = true;
        for (int v : edges[u]) {
            if (!used[v]) {
                dfs(v);
            }
        }
    }
    

    复杂度分析

    • 时间复杂度:O(n+m),其中 m 是数组 connections 的长度。

    • 空间复杂度:O(n+m),其中 O(m) 为存储所有边需要的空间,O(n) 为深度优先搜索中使用的栈空间。

    题目来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/distance-between-bus-stops

    --------------最后感谢大家的阅读,愿大家技术越来越流弊!--------------

    在这里插入图片描述

    --------------也希望大家给我点支持,谢谢各位大佬了!!!--------------

    展开全文
  • 宇宙文明等级的划分标准

    千次阅读 2017-05-04 10:31:18
    本人根据对当今世界的系列前沿科学知识的一些浅薄了解,结合自己的大胆推测,把宇宙中已知的人类文明(即我们地球人的文明)和未知的其他文明做了个标准划分,事先说明:这只是个人推论,不具备真实的数据。...
  • 实验.等价类划分测试方法0 目录1 等价类划分测试方法1.1 等价类划分测试方法1.1.1 实验目的1.1.2 实验预习1.1.3 实验内容及要求1.1.4 实验总结2 实验二 0 目录 1 等价类划分测试方法 1.1 等价类划分测试方法 1.1.1...
  • 很短的时间看完基础语法,然后去了解一些重难点、易错点,最后自己亲自动手完成个项目,达到融会贯通的效果。这样下来,可能几周时间就掌握得差不多了。 你看,这样从「工程角度」去学习和理解一门语言,会让你...
  • 时区的概念与划分

    千次阅读 2017-12-09 17:15:28
    以本初子午线(格林威治,Greenwich)的时间作为标准时间,东加西减,在经度180度相差一天,称为国际换日线,这就是格林威治标准时间(Greenwich Mean Time GMT)。 计算方式360度24小时,每15度一个时区,来划分24...
  • [转载]宇宙文明等级的划分标准

    千次阅读 2018-01-05 11:03:06
    本人根据对当今世界的系列前沿科学知识的一些浅薄了解,结合自己的大胆推测,把宇宙中已知的人类文明(即我们地球人的文明)和未知的其他文明做了个标准划分,事先说明:这只是个人推论,不具备真实的数据。...
  • linux磁盘划分

    千次阅读 2018-07-02 07:06:00
    前几遇到了这样个情景:个服务器是以虚拟机的形式提供的,通过df -h看服务器磁盘空间只有30多个G,但通过fdisk -l看发现有个160G的磁盘空间 没有挂载,...
  • 网络社区划分算法

    千次阅读 2018-10-12 14:10:15
    网络社区划分算法 目录  [隐藏]  1 简介 2 构建个点击流网络 3 网络社区划分的两种主要思路:拓扑分析和流分析 4 拓扑分析 4.1 计算网络的模块化程度Q-Modularity 4.2 ...
  • 论文级别划分

    万次阅读 2017-09-17 10:37:45
    、full paper、short paper、poster、oral: CV界的会议一般分三级: oral,需要作者准备PPT上台进行presentation; poster,作者贴一张海报,如果有人感兴趣就会到该作者的墙报前面讨论; workshop,一般都是...
  • BUG等级划分方法

    千次阅读 2017-10-16 17:35:47
    、 测试BUG等级划分标准1、 Blocker(崩溃):阻碍开发或测试工作的问题;造成系统崩溃、死机、死循环,导致数据库数据丢失,与数据库连接错误,主要功能丧失,基本模块缺失等问题。如:代码错误、死循环、数据库...
  • 耳切法处理多边形三角划分

    万次阅读 2016-10-18 09:23:04
    2016.10.18 孙广东 ...  日文《【Unity】Ear Clipping Triangulation》, 它使用这个技术 弄了软体的功能 复原了 Soft Body - p5....种 网格多边形三角化算法之。 我之前 也写过文章关于在Unity下 使用Mesh...
  • 最近有小伙伴面试,对数据结构和算法比较头疼,我整理了波资料,帮助大家快速掌握数据结构和算法的面试,感觉有用的下伙伴,点赞支持哦! 不叨叨,直接上干货。 目录 Q1:数据结构和算法的知识点整理: Q2:...
  • 本文章某周第几天按照中国人习惯如第一天是星期一和第七天是星期日,其中星期一和星期日具体是那一天如哪年哪月哪日? 1.求出本星期的第一天日期(以星期一为第一天) 请输入占位符 select trunc(sysdate,'DD'...
  • Hive根据时间创建分区

    千次阅读 2018-04-27 19:57:56
    (1)时间函数DirectoryAndBrands.java/*** 获得当前时间的前一天* */public static Date getNextDay(Date date) {Calendar calendar = Calendar.getInstance();calendar.setTime(date);calendar.add(Calendar.DAY_OF_...
  • 把经验记在这里,免得过几又忘了。安装Cisco Packet Tracer首先需要下载和安装这次实验的工具,Cisco Packet Tracer。这是个模拟路由器、交换机和各种终端设备连接和配置的模拟工具,可以非常方便的建立网络拓扑...
  • 数据分析-划分客户等级

    万次阅读 2018-09-21 10:13:05
    文章目录概念1. 划分客户真题:网易笔试:真题:网易...如果我们将企业的客户按照下单频次和客单价两个维度切分成四个象限,划分为A、B、C、D、E五个群体,企业的核心诉求之,便是找到更多的潜在客户群体A,转化为...
  • 天时间管理

    千次阅读 2011-12-07 08:42:30
    今天是课程的第一天,我们将通过一个练习和一套自测题来了解什么是时间管理。 请先完成下面这个小练习,在后面我们将以它作为讲解实例。 练 习 假设现在是星期一的晚上,你要计划未来五天的日程,面前是这五...
  •   在日常工作学习中,遇到最多的就是关于时间的处理,因此这里专门写了篇文章,来对python中的时间处理模块进行详细的说明。 2、UTC时间和CST时间 ① UTC时间,又称“世界标准时间”,每个国家的当地时间就是以...
  • nyoj 571 整数划分问题(dp)

    千次阅读 2013-03-16 13:51:41
    整数划分(三) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 ...第行: 将n划分成若干正整数之和的划分数。 第二行: 将n划分成k个正整数之和的划分数。 第三行: 将n划分成最大数
  • 黑盒测试--等价类划分、边界值分析

    万次阅读 多人点赞 2016-05-11 13:45:28
    题三等价类划分把全部输入数据合理地划分为若干等价类,在每个等价类中取个数据作为测试的输入条件,就可以用少量代表性的测试数据取得较好的测试结果。有效等价类:指对于程序的规格说明来说是合理的、有意义的...
  • 通过给定的固定的时间段,输出在该时间段内固定间隔的每个时刻的List集合,如果最后的时间间隔不够的话,将结束时间作为最后的时刻。 /** * 获取固定间隔时刻集合 * @param start 开始时间 * @param end ...
  • 句子成分划分(口诀符号及方法)

    万次阅读 2019-01-05 10:53:22
    划分句子的口诀:  (1)句子成分要划对, (2)纵观全局找主谓。  (3)主前定状谓后补,  (4)谓前只有状地位。 (5)“的”定“地”状“得”后补, (6)宾语只受谓支配。      划分句子成分 ...
  •  经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是个重要的纬度,加上做一些钻取,时间日期函数不可避免。所以今天就给大家分享个自定义的做日期的方法,当然自己使用Excel用公式做个也很快,...
  • 电磁波频谱的划分: 1、甚低频(VLF)3 kHz~30 kHz,对应电磁波的波长为甚长波100 km~10 km; 2、低频(LF)30 kHz ~300 kHz,对应电磁波的波长为长波10 km~1 km; 3、中频(MF)300 kHz~3000 kHz,对应电磁波的波长为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 109,553
精华内容 43,821
关键字:

一天时间划分表