java - 算法问题:同一时间不能存在三个公告
高洛峰
高洛峰 2017-04-18 09:32:05
0
7
376

1.创建公告时有生效的时间段:开始时间和过期时间;

2.当创建新的公告时,要保证同一时间点不能存在三个同时生效的公告

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(7)
PHPzhong

Setiap kali anda membuat ciptaan baharu, anda mesti mengetahui set yang bertindih dengan set yang dibuat sekarang, dan kemudian mengesahkan sama ada terdapat mana-mana dua set yang bertindih Jika ada, maka set ini tidak akan dibuat memastikan set tidak akan dibuat dalam set yang sama Terdapat tiga pengumuman pada masa itu

洪涛

Cukup tulis sql dan selesai:

select count(1) from table where start <= 新公告end and end >= 新公告start

Jika hasilnya kurang daripada 3, buatnya.

左手右手慢动作

Apabila memasukkan, rentasi jadual, tentukan sama ada cap masa semasa berada di antara dua cap masa dan rekod nombor yang memenuhi syarat ini Jika >= 3, pemasukan tidak akan dilakukan. Jika tidak, masukkan ke dalam jadual data.

阿神

Gunakan dua titik masa untuk mengira berapa banyak pengumuman berkesan yang ada dalam tempoh masa ini!
Tidak boleh dibuat jika terdapat lebih daripada 3.

阿神

Cara bodoh untuk mengetahui sepanjang masa yang bertindih dengan pengumuman baharu, dan kemudian membuat statistik mengikut hari

小葫芦

Saya cuba menulisnya, anda boleh merujuknya,

public class OtherTest {
    public static void main(String[] args) {

        boolean bn = new OtherTest().test();
        System.out.println(bn);
    }
    public boolean test(){
        //查询出在要添加的公告时间段内的公告时间段
        TimeNode node1 =new TimeNode(1, 4);
        TimeNode node2 =new TimeNode(1, 4);
        TimeNode node3 =new TimeNode(9, 11);
        List<TimeNode> list= new ArrayList<TimeNode>();
        list.add(node1);
        list.add(node2);
        list.add(node3);
        //是否有交集?
        boolean insert = true;
        for(int i=0;i<list.size();i++){
            TimeNode nodeI = list.get(i);
            for(int j=(i+1);j<list.size();j++){
                TimeNode nodeJ = list.get(j);
                //如果存在两个时间段有交集 那说明在交集的时间段内已经有2个公告了,不能在添加了
                if(nodeI.end > nodeJ.start && nodeI.start < nodeJ.end){
                        insert = false; //false return
                        break;
                }
            }
            if(!insert){
                break;
            }
        }
        return insert;
    }
    
    class TimeNode{
        int start;
        int end;
        public TimeNode(int pStart,int pEnd){
            start = pStart;
            end = pEnd;
        }
    }
}
阿神

Masalah liputan segmen talian klasik. Saya tidak tahu Java, jadi saya akan memberi anda idea O(n).

  1. Mula-mula cari semua selang yang bersilang dengan selang untuk disahkan, Isih mengikut titik akhir kiri selang dari kecil ke besar

  2. Ingat selang pertama sebagai CurrentInternal

  3. Untuk CurrentInternal, periksa item seterusnya NextInterval: jika ia tidak bersilang dengan CurrentInternal, rekodkannya sebagai CurrentInternal dan lompat ke 2 jika tidak, rekodkan selang persilangannya sebagai Intersection.

  4. Untuk Intersection, lintasi item selepas NextInterval: jika tiada selang yang bersilang dengan Intersection, maka rekodkan NextInterval sebagai CurrentInterval dan lompat ke 2 jika tidak, ini bermakna terdapat tiga selang bersilang dan keluar.

  5. Jika keseluruhan senarai dilalui, ia membuktikan bahawa selang masa untuk disahkan adalah sah.


DEMO yang ditulis dalam JS disertakan, saya harap anda semua bergembira

https://jsfiddle.net/hsfzxjy/7td0rwr2/28/

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan