Rumah > Soal Jawab > teks badan
1.创建公告时有生效的时间段:开始时间和过期时间;
2.当创建新的公告时,要保证同一时间点不能存在三个同时生效的公告
PHPz2017-04-18 09:34:05
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
PHP中文网2017-04-18 09:34:05
Cukup tulis sql dan selesai:
select count(1) from table where start <= 新公告end and end >= 新公告start
Jika hasilnya kurang daripada 3, buatnya.
ringa_lee2017-04-18 09:34:05
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.
阿神2017-04-18 09:34:05
Gunakan dua titik masa untuk mengira berapa banyak pengumuman berkesan yang ada dalam tempoh masa ini!
Tidak boleh dibuat jika terdapat lebih daripada 3.
阿神2017-04-18 09:34:05
Cara bodoh untuk mengetahui sepanjang masa yang bertindih dengan pengumuman baharu, dan kemudian membuat statistik mengikut hari
高洛峰2017-04-18 09:34:05
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;
}
}
}
阿神2017-04-18 09:34:05
Masalah liputan segmen talian klasik. Saya tidak tahu Java, jadi saya akan memberi anda idea O(n).
Mula-mula cari semua selang yang bersilang dengan selang untuk disahkan, Isih mengikut titik akhir kiri selang dari kecil ke besar
Ingat selang pertama sebagai CurrentInternal
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.
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.
Jika keseluruhan senarai dilalui, ia membuktikan bahawa selang masa untuk disahkan adalah sah.
https://jsfiddle.net/hsfzxjy/7td0rwr2/28/