suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Javascript – Finden Sie die optimale Lösung für den Schnittpunkt zwischen Zeiträumen

Bestimmen Sie, ob es einen Schnittpunkt zwischen einem Zeitraum und mehreren Zeiträumen gibt. Wenn die Start- und Endzeiten gleich sind, wird davon ausgegangen, dass es sich um eine Kreuzung handelt
z.B.

判断 
12:30:00--14:20:00
与下列时间段是否有交集
10:00:00-12:00:00,  12:10:00-12:50:00 , 14:30:00-15:00:00

Konvertieren Sie sie in einen Zeitstempel und vergleichen Sie sie dann einzeln in einer Schleife

function is_cross($st1, $et1, $st2, $et2)
    {
        $status = $st2 - $st1;
        if ($status > 0) {
            $status2 = $st2 - $et1;
            if ($status2 >= 0) {
                return false;
            } else {
                return true;
            }
        } else {
            $status2 = $et2 - $st1;
            if ($status2 > 0) {
                return true;
            } else {
                return false;
            }
        }
    }

Dies kann das Problem lösen, aber wir suchen nach einer besseren Methode mit dem geringsten Zeitaufwand

PHP中文网PHP中文网2779 Tage vor1261

Antworte allen(7)Ich werde antworten

  • 世界只因有你

    世界只因有你2017-06-30 09:55:32

    public function inter(){

        $tar=[6,4];
        if($tar[0]>$tar[1]){
            $temp=$tar[0];
            $tar[0]=$tar[1];
            $tar[1]=$temp;
        }
        $all=[
            [5,6],
            [7,9],
            [1,4],
            [3,1],
            [1,3],
            [8,7]
        ];
        //排序
        foreach ($all as &$v){
            if($v[0]>$v[1]){
                $temp=$v[0];
                $v[0]=$v[1];
                $v[1]=$temp;
            }
        }
        foreach ($all as $k=>$v){
            $left=$tar[0]>$v[1];
            $right=$v[0]>$tar[1];
            if(!($left||$right)){
                var_dump($v);
            }
        }
    
    }

    Antwort
    0
  • 大家讲道理

    大家讲道理2017-06-30 09:55:32

    将时间转化为时间戳,然后-------对比。

    Antwort
    0
  • 我想大声告诉你

    我想大声告诉你2017-06-30 09:55:32

    如果这个 一堆一段时间 需要被多次使用: 可以用线段树。一次使用时"一一对比"也不会更慢。

    Antwort
    0
  • 迷茫

    迷茫2017-06-30 09:55:32

    # -*- coding: utf-8 -*-
    
    def is_mixed(t1, t2):
        '''
        假定时间段格式是:"10:00:00-12:00:00"
        判断 t1,t2是否有交集
        '''
        s1, e1 = t1.split("-")
        s2, e2 = t2.split("-")
    
        if s1 > e2 and s2 > e1:
            return True
        if s2 > e1 and s1 > e2:
            return True
    
        return False
    
    t1 = "12:30:00-04:20:00"
    t2 = "03:00:00-22:23:00"
    
    if is_mixed(t1, t2):
        print "有交集!"
    else:
        print "木有交集!"
    

    python版本,js应该也是一样的

    Antwort
    0
  • ringa_lee

    ringa_lee2017-06-30 09:55:32

    转换成时间戳能方便比较点

    Antwort
    0
  • 怪我咯

    怪我咯2017-06-30 09:55:32

    这样可以从periods挑出和period有交集的时间段。

    period  = "12:30:00-14:20:00"
    periods  = ["10:00:00-12:00:00", "12:10:00-12:50:00","14:30:00-15:00:00"]
    
    print([x+'-'+y for [b,e] in [period.split("-")] for [x,y] in [p.split("-") for p in periods] if x<=e and y>=b])

    Antwort
    0
  • 漂亮男人

    漂亮男人2017-06-30 09:55:32

    把时间转换为整型123000, 反向判断
    a -- b
    c -- d
    这两个时间段,在什么情况下没有交集

    1. b < c

    2. a > d

    Antwort
    0
  • StornierenAntwort