recherche

Maison  >  Questions et réponses  >  le corps du texte

java - 算法问题:同一时间不能存在三个公告

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

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

高洛峰高洛峰2889 Il y a quelques jours381

répondre à tous(7)je répondrai

  • PHPz

    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

    .

    répondre
    0
  • PHP中文网

    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.

    répondre
    0
  • ringa_lee

    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.

    répondre
    0
  • 阿神

    阿神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.

    répondre
    0
  • 阿神

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

    répondre
    0
  • 高洛峰

    高洛峰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;
            }
        }
    }

    répondre
    0
  • 阿神

    阿神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).

    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/

    répondre
    0
  • Annulerrépondre