JavaRush /Java Blog /Random-TL /Pagpipilian para sa paglutas sa antas ng problema 19 gawa...

Pagpipilian para sa paglutas sa antas ng problema 19 gawain 16 (pagsubaybay sa mga pagbabago)

Nai-publish sa grupo

Background:

Nalutas ko ang problemang ito sa napakatagal na panahon . Sa loob nito ay kinakailangan upang ihambing ang 2 bersyon ng file at maghanap ng mga pagbabago. Nagpasya akong kunin ang mga nilalaman ng mga file sa anyo ng mga array at ihambing ang mga array. Pagkatapos ay naging tanga ako ng mahabang panahon at nagkamali at sa huli ay gumuhit ako ng mga arrays sa isang piraso ng papel sa isang kahon. Actually, bago ito tumingin ako sa ibang solusyon. Ngunit napakakomplikado kaya hindi ko ito ma-master :) Bilang karagdagan, mayroong 2 magkakaibang algorithm kung sakaling mas mahaba ang lumang file at kung mas mahaba ang bagong file. hindi ko nagustuhan.

Ang diwa ng aking solusyon:

Mayroong 2 magkaparehong array. Sa buong teksto, tatawagin ko silang "bagong hanay" at "lumang hanay". At ang mga bagong elemento ay maaaring ipasok sa bawat isa sa kanila. Yung. Ang hanay ng sanggunian ay itinuturing na ang naaayon sa mga nilalaman ng lumang file na may lahat ng mga pagtanggal. Ang mga nilalaman ng luma at bagong file ay itinuturing bilang isang sanggunian na may mga pagsingit. Dumadaan kami sa parehong mga array (ang mga nilalaman ng luma at bago) sa isang loop. At kung may nakita kaming pagpapasok sa isa sa mga ito, lalaktawan namin ang isang hakbang upang ang parehong mga elemento ng pinaghahambing na mga array ay muling nasa malapit.

Algorithm:

Mga Variable: i - index ng array cell na may mga nilalaman ng LUMANG file. nI - index ng array cell na may mga nilalaman ng BAGONG file. Kung ang mga elemento ng array ay naiiba, isinusulat namin ang mga ito sa mga pansamantalang variable: oldMismatch - isang elemento mula sa isang stacked array newMismatch - isang elemento mula sa isang bagong array Kapag umuulit sa mga elemento ng array, posible ang mga sumusunod na kaso:
  1. ang oldMismatch at newMismatch variable ay walang laman. Ang mga elemento sa dalawang array ay pareho. Isulat ang Uri.PAREHONG sa listahan. Sige lang.

  2. ang oldMismatch at newMismatch variable ay walang laman. Ang mga elemento sa dalawang array ay HINDI pareho. Sinusulat namin ang halaga mula sa luma hanggang sa lumangMismatch, mula sa bago hanggang sa bagongMismatch. Sige lang.

  3. ang mga variable na oldMismatch at newMismatch ay HINDI walang laman. Inihahambing namin ang mga ito sa kasalukuyang mga elemento ng array.

    Gumawa tayo ng mga konklusyon. Isinulat namin ang mga natuklasan sa isang listahan (variable ng mga linya). Nilaktawan namin ang loop na hakbang para sa isa sa mga array.

    1. Ang 3.1 oldMismatch ay katumbas ng kasalukuyang elemento ng BAGONG array. Nangangahulugan ito na may idinagdag na linya sa file.

      Ang halaga ng string na ito ay naka-imbak sa newMismatch. Isulat natin ng ganyan.

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));

      Dahil mayroong karagdagang elemento sa array na naglalaman ng mga nilalaman ng bagong file, kailangan mong ilipat ang bagong array 1 elemento pasulong na may kaugnayan sa luma.

      Samakatuwid, ang OLD array ay lumalaktaw sa 1 loop step.

      ako--;

    2. Ang 3.2 newMismatch ay katumbas ng kasalukuyang elemento ng OLD array. Nangangahulugan ito na ang isang linya ay tinanggal mula sa file. Isulat natin ito.

      lines.add(new LineItem(Type.REMOVED, oldMismatch));
       lines.add(new LineItem(Type.SAME, newMismatch));

      Mayroong karagdagang elemento sa OLD array. Nangangahulugan ito na ang BAGONG array ay lumalaktaw sa 1 loop na hakbang.

      nI--;

  4. Pinoproseso ang dulo ng array. At ngayon ay nakarating na tayo sa dulo ng lumang hanay. Mayroong ilang mga posibleng sitwasyon

    1. 4.1 - ArrayIndexOutOfBoundsException - ang bagong array ay mas maikli kaysa sa luma. Itinatala namin na ang huling linya ng file ay tinanggal.

    2. 4.2 - Ang huling elemento ng bagong array ay nananatili, hindi sakop ng aming pansin. Itinatala namin ito bilang idinagdag.

    3. 4.3 - Ang mga variable na oldMismatch at newMismatch ay hindi walang laman. Sumulat kami:

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));
PS - huwag kalimutang i-reset ang mga variable at subaybayan ang nI variable.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION