Problem 22: Namenszahlen

Gesucht ist die Summe der alphabetischen Werte von 5000 gegebenen Worten (Namen)! [ das englische Original ]

Der alphabetische Wert eines Wortes soll sich als die Summe der Positionen seiner Buchstaben im Alphabet, multipliziert mit der Position des Wortes in der gegebenen Liste, berechnen. Hier einmal ein kleines Beispiel mit nur 6 Worten:

Ein kleines Beispiel, das mit 6 Worten die Berechnung darstellt.
Ein kleines Beispiel, das mit 6 Worten die Berechnung darstellt.

Im aktuellen Problem ist die Liste der Worte etwas länger (5000) und besteht ausschließlich aus Namen, was die Aufgabe aber nicht vereinfacht 😉 Außerdem soll die Liste im ersten Schritt alphabetisch sortiert werden, was ich gleich einmal in die Methode zum Einlesen der Namen verlagert habe:

public static String[] readSortedStrings( String file ) {
   String[] result = new String[ 0 ];
 
   try {
      FileReader fr = new FileReader( file );
      BufferedReader br = new BufferedReader(fr );

      String line; int pos;
      while( ( line = br.readLine() ) != null ) {
         Scanner scan = new Scanner( line );
         scan.useDelimiter( "," );
         while( scan.hasNext() ) {
            String[] mem = new String[ result.length+1 ];
            String cur = scan.next();
            cur = cur.substring( 1, cur.length()-1 );
            pos = 0;
            for( int i=0; i<result.length; i++ ) {
               if( pos == 0 ) {
                  if( cur.compareTo( result[ i ] ) < 0 ) {
                     mem[ i ] = cur;
                     pos = 1;
                  }
               }
 
               mem[ i+pos ] = result[ i ];
            }
            if( pos == 0 ) {
               mem[ result.length ] = cur;
            }
            result = mem;
         }
         scan.close();
      }
 
      br.close();
   } catch( Exception e ) {
      IO.debugln( e.getMessage() );
      result = null;
   }
 
   return result;
}

Im zweiten Schritt braucht es nun eine Methode, die den alphabetischen Wert für einen gegeben Text berechnet:

private int getAlphabeticalValue( String name ) {
   int res = 0;
 
   for( byte b : name.getBytes() ) {
      res += b - 64;
   }
 
   return res;
}

Mit beiden oben gezeigten Methoden lässt sich das Problem nun recht einfach und in einer akzeptablen Zeit lösen:

@Override
public String solve() {
   long res = 0;
 
   for( int i=0; i<names.length; i++ ) {
      res += ( i+1 ) * getAlphabeticalValue( names[ i ] );
   }
 
   return IO.l2s( res );
}

 

Den vollständigen Quellcode der Klasse für die Lösung des Problems 22 kann man sich hier anschauen!

<< Problem 21 Übersicht Problem 23 >>

Kommentar verfassen

Willkommen in Nico Dannebergs Netzwerk

%d Bloggern gefällt das: