2013-02-22 3 views

Antwort

41

Da dies höchstwahrscheinlich eine Lernzuordnung Ich gebe Ihnen einen Hinweis: Alle UNICODE-Codepunkte für die Buchstaben des lateinischen Alphabets sind alphabetisch geordnet. Wenn der Code a eine Nummer N ist, dann ist der Code bN+1, der Code c ist N+2, und so weiter; Der Code Z lautet N+26.

Sie können Zeichencodepunkte auf die gleiche Weise subtrahieren, wie Sie ganze Zahlen subtrahieren. Da die Codepunkte alphabetisch geordnet sind, wird die folgende Berechnung

char ch = 'h'; 
int pos = ch - 'a' + 1; 

erzeugt die Sequenznummer h, d.h. 8. Wenn Sie diese Berechnung in einer Schleife durchführen, erhalten Sie das Ergebnis, das Sie benötigen.

Beachten Sie, dass die obige Formel nur mit Zeichen des gleichen Registers funktioniert. Wenn Ihre Eingabezeichenfolge in Groß- und Kleinschreibung eingegeben wird, müssen Sie vor der Berechnung jedes Zeichen in Kleinbuchstaben umwandeln, andernfalls würde es sich als falsch herausstellen.

+11

+1 für die einzige Antwort zu versuchen, zu lehren, anstatt den Code zu geben. – iamnotmaynard

1
String s = "hello world"; 
String t = ""; 
for (int i = 0; i < s.length(); ++i) { 
    char ch = s.charAt(i); 
    if (!t.isEmpty()) { 
     t += " "; 
    } 
    int n = (int)ch - (int)'a' + 1; 
    t += String.valueOf(n); 
} 
System.out.println(t); 

Dieser nicht mit Platz befasst usw.

0

Sie können wie etwas tun:

for (int i = 0; i < a.length(); ++i) { 
    if (a.charAt(i) >= 'a' && a.charAt(i) <= 'z') { 
    System.out.println((int)a.charAt(i) - (int)'a'); 
    } 
} 
1
public static void main(String[] args) { 
    String s = "hello world"; 
    s = s.replace(" ", ""); 
    char[] c = s.toCharArray(); 

    for (Character ss : c) 
     System.out.println(ss - 'a' + 1); 
} 
1

Usa eine Karte mit dem Schlüssel ist das Zeichen und ein Wert, der die ganzen Zahlen ist. Dies ist kein effizienter Weg - die Karte sollte ein statisches Mitglied der Klasse sein.

import java.util.HashMap; 
import java.util.Map; 


public class JavaApplication1 
{ 
    public static void main(String[] args) 
    { 
     final Map<Character, Integer> map; 
     final String str = "hello world"; 

     map = new HashMap<>(); 
     // or map = new HashMap<Character, Integer> if you are using something before Java 7. 
     map.put('a', 1); 
     map.put('b', 2); 
     map.put('c', 3); 
     map.put('d', 4); 
     map.put('e', 5); 
     map.put('f', 6); 
     map.put('g', 7); 
     map.put('h', 8); 
     map.put('i', 9); 
     map.put('j', 10); 
     map.put('k', 11); 
     map.put('l', 12); 
     map.put('m', 13); 
     map.put('n', 14); 
     map.put('o', 15); 
     map.put('p', 16); 
     map.put('q', 17); 
     map.put('r', 18); 
     map.put('s', 19); 
     map.put('t', 20); 
     map.put('u', 21); 
     map.put('v', 22); 
     map.put('w', 23); 
     map.put('x', 24); 
     map.put('y', 25); 
     map.put('z', 26); 

     for(final char c : str.toCharArray()) 
     { 
      final Integer val; 

      val = map.get(c); 

      if(val == null) 
      { 
       // some sort of error 
      } 
      else 
      { 
       System.out.print(val + " "); 
      } 
     } 

     System.out.println(); 
    } 
} 
+0

+1 für detaillierte Erklärung. BDW diese Frage wurde mir in dem Interview gestellt, das ich mit dem gleichen Ansatz beantwortete. :) – amod

+0

Ich verstehe nicht, warum Sie es so machen würden. "Das ist kein effizienter Weg" = es gibt einen besseren Weg - was ist das? – Menasheh

+0

Es ist ein leicht verständlicher Weg. Wenn es nicht sehr häufig verwendet wird, spielt die Effizienz keine Rolle. Ziel Nr. 1 ist es richtig zu machen, Ziel Nr. 2 ist einfach zu verstehen/beizubehalten, Ziel Nr. 3 macht es schnell. Wenn Sie andere Ziele haben, werden sie wahrscheinlich zwischen # 2 und # 3 eingefügt. Geschwindigkeit ist im Allgemeinen nicht so wichtig, da Sie herausfinden können, wo Ihr Code langsam ist und dann entscheiden, wie Sie ihn am schnellsten beschleunigen können. – TofuBeer

1

für jedes Zeichen bei Position i: Ausgabe an CharAt (i) - 'a' + 1. s ist die Zeichenfolge.

Verwandte Themen