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

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

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

高洛峰
高洛峰

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

répondre à tous(7)
PHPzhong

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

.
洪涛

É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.

左手右手慢动作

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.

阿神

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.

阿神

Une façon stupide de connaître tout le temps qui chevauche la nouvelle annonce, puis de faire des statistiques par jour

小葫芦

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;
        }
    }
}
阿神

Problème de couverture des segments de ligne classiques. Je ne connais pas Java, donc je vais vous donner une idée O(n).

  1. Trouver d'abord tous les intervalles qui croisent l'intervalle à vérifier, Trier par l'extrémité gauche de l'intervalle de petit à grand

  2. Mémorisez le premier intervalle comme CurrentInternal

  3. 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.

  4. 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.

  5. Si la liste entière est parcourue, cela prouve que l'intervalle à vérifier est légal.


Une DÉMO écrite en JS est incluse, j'espère que vous vous amuserez tous

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal