Rochet2

TIRA 1.5 esimerkki

Sep 15th, 2015
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.44 KB | None | 0 0
  1. import java.util.*;
  2. /*
  3.     Ratkaisun idea: lähdetään rakentamaan uutta merkkijonoa
  4.     merkki kerrallaan. Seuraava huomio on oleellinen: jos jotain
  5.     merkkiä on jäljellä 1 enemmän kuin kaikkia muita merkkejä
  6.     yhteensä, niin joudumme lisäämään sen. Esimerkiksi tilanteessa
  7.     jossa jäljellä olevat kirjaimemme olisivat c,c,c,a,b joudumme
  8.     käyttämään merkit a ja b erottamaan merkkejä c toisistaan.
  9.     Sijoittaisimme ne siis merkkijonoon seuraavasti: cacbc.
  10.  
  11.     Algoritmi toimii seuraavasti: pidetään aina muistissa edellisessä
  12.     indeksissä olevaa kirjainta. Sen lisäksi tarkistamme aina
  13.     onko jotain kirjainta jäljellä yksi kappale enemmän kuin muita
  14.     kirjaimia yhteensä. Jos tällainen kirjain löytyy, sijoitamme sen
  15.     rakennettavan merkkijonon perälle. Muutoin sijoitamme merkkijonoon
  16.     pienimmän kirjaimen, jota on jäljellä ja joka ei esiinny edellsisessä
  17.     indeksissä.
  18. */
  19. public class Main {
  20.     public static String jarjestaMerkit(String mjono) {
  21.         int n=mjono.length();
  22.  
  23.         int[] merkkien_esiintyvyys=new int[256];
  24.  
  25.         for(int i=0; i<n; i++)
  26.             merkkien_esiintyvyys[mjono.charAt(i)]++;
  27.  
  28.         StringBuilder vastaus=new StringBuilder();
  29.  
  30.         int jaljella=n;
  31.         int kirjain_vasemmalla=-1;
  32.  
  33.         while(jaljella!=0){
  34.  
  35.             boolean pakko=false;
  36.  
  37.             for(int i='A'; i<='Z'; i++){
  38.                 if(merkkien_esiintyvyys[i]*2==jaljella+1){
  39.                     merkkien_esiintyvyys[i]--;
  40.                     pakko=true;
  41.                     vastaus.append((char)(i));
  42.                     jaljella--;
  43.                     kirjain_vasemmalla=i;
  44.                     break;
  45.                 }
  46.             }
  47.  
  48.             if(pakko)
  49.                 continue;
  50.  
  51.             for(int i='A'; i<='Z'; i++){
  52.                 if(merkkien_esiintyvyys[i]!=0&&i!=kirjain_vasemmalla){
  53.                     merkkien_esiintyvyys[i]--;
  54.                     vastaus.append((char)(i));
  55.                     jaljella--;
  56.                     kirjain_vasemmalla=i;
  57.                     break;
  58.                 }
  59.             }
  60.         }
  61.         return vastaus.toString();
  62.     }
  63.  
  64.     public static void main(String[] args) {
  65.         System.out.println(jarjestaMerkit("BAAACCC"));
  66.         System.out.println(jarjestaMerkit("CBAED"));
  67.         System.out.println(jarjestaMerkit("AXAXA"));
  68.         System.out.println(jarjestaMerkit("CBAXXXX"));
  69.     }
  70. }
Add Comment
Please, Sign In to add comment