Maison > Questions et réponses > le corps du texte
1.创建公告时有生效的时间段:开始时间和过期时间;
2.当创建新的公告时,要保证同一时间点不能存在三个同时生效的公告
PHPz2017-04-18 09:34:05
Chaque fois que vous créez une nouvelle création, vous devez d'abord rechercher l'ensemble qui chevauche l'ensemble actuellement créé, puis vérifier s'il existe deux ensembles qui se chevauchent. S'il y en a, il ne sera pas créé. garantit que le set ne sera pas créé dans le même set. Il y a trois annonces à ce moment
.PHP中文网2017-04-18 09:34:05
Écrivez simplement du SQL et c'est fait :
select count(1) from table where start <= 新公告end and end >= 新公告start
Si le résultat est inférieur à 3, créez-le.
ringa_lee2017-04-18 09:34:05
Lors de l'insertion, parcourez le tableau, déterminez si l'horodatage actuel est entre deux horodatages et enregistrez le nombre qui remplit cette condition. Si >= 3, aucune insertion n'est effectuée. Sinon, insérez-le dans le tableau de données.
阿神2017-04-18 09:34:05
Utilisez deux points dans le temps pour compter le nombre d'annonces efficaces au cours de cette période !
Vous ne pouvez pas créer plus de 3 éléments.
阿神2017-04-18 09:34:05
Une façon stupide de connaître tout le temps qui chevauche la nouvelle annonce, puis de faire des statistiques par jour
高洛峰2017-04-18 09:34:05
J'ai essayé de l'écrire, vous pouvez vous y référer,
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
Problème de couverture des segments de ligne classiques. Je ne connais pas Java, donc je vais vous donner une idée O(n).
Trouver d'abord tous les intervalles qui croisent l'intervalle à vérifier, Trier par l'extrémité gauche de l'intervalle de petit à grand
Mémorisez le premier intervalle comme CurrentInternal
Pour CurrentInternal, examinez son élément suivant NextInterval : s'il ne croise pas CurrentInternal, enregistrez-le comme CurrentInternal et passez à 2, sinon, enregistrez son intervalle d'intersection comme Intersection.
Pour Intersection, parcourez les éléments après NextInterval : s'il n'y a aucun intervalle qui croise Intersection, alors enregistrez NextInterval comme CurrentInterval et passez à 2 ; sinon, cela signifie qu'il y a trois intervalles qui se croisent et quittez.
Si la liste entière est parcourue, cela prouve que l'intervalle à vérifier est légal.
https://jsfiddle.net/hsfzxjy/7td0rwr2/28/