2016-08-04 10 views
-2

ich auf die folgende Frage kam die Codierung Interview in Cracking, 1.1:die Codierung Interview Cracking, 4. Aufl, 1,1

einen Algorithmus implementieren, um zu bestimmen, ob eine Zeichenfolge alle eindeutigen Zeichen. Was, wenn Sie keine zusätzlichen Datenstrukturen verwenden können?

Hier ist die Lösung Buch:
enter image description here

Hier ist meine Lösung:

public boolean allUnique(String input) { 

HashSet<Character> set = new Hashset<Character>(); 
char c; 

for (int i = 0; i < input.length(); i++) { 
    c = input.charAt(i); 
if (set.contains(c)) return false; 
set.add(c); 
} 
return true; 

meine Lösung funktioniert, und wie effizient ist es? Ich habe mich auch gefragt, ob jemand ASCII erklären könnte und wie es für dieses Problem relevant ist, da es in der Buchlösung kurz erwähnt wurde. Ist das der Grund, warum wir jedes Zeichen im String in eine Ganzzahl schreiben können?

Vielen Dank!

+0

Was ist mit dem Teil 'Was ist, wenn Sie keine zusätzlichen Datenstrukturen verwenden können?' –

+3

Ihre Frage scheint viele mögliche Antworten zu enthalten, und Ihr Code sieht so aus, als müsste er laufen. Vielleicht gehört das zu [Code Review] (http://codereview.stackexchange.com). –

+0

ASCII ist nur ein Zeichensatz. Genau wie Unicode ist ein anderer Zeichensatz. ASCII wird normalerweise im Bereich 0-127 verwendet, während 128-256 normalerweise nicht verwendet wird. Da Sie ein assoziatives Array haben können, wäre es dann nicht besser, das zu verwenden und nur jeden Ort zu erhöhen? Dann, wenn der Array-Eintrag größer als eins (1) ist, haben Sie ein Duplikat. Nur ein Gedanke. (Bearbeiten): Ah! Ein boolesches Array ist genauso gut. :-) –

Antwort

1

Um zu zeigen, wie man es nicht um ein Array zu verwenden (nicht bekannt, ob dies wirklich schnell ist oder nicht) können Sie:

function boolean allUnique(String input){ 
for(int i=0; i<input.length(); i++){ 
    if(input.indexOf(input.charAt(i),i) > -1){ return false; } 
    } 

return true; 
} 

Die oben nicht getestet, aber funktionieren soll. Das ", i)" muss möglicherweise ", i + 1)" sein, um es über das aktuelle Zeichen hinaus zu setzen. Aber ich denke nur ", i)" sollte funktionieren.

+0

'String # indexOf' implementiert eine lineare Suche, so dass Ihr Code linear nach jedem Zeichen in' input' sucht. Ihre Lösung ist eine verschachtelte for-Schleife, wobei die innere for-Schleife 'for (int j = 0; j

+0

Korrekt ist, aber es testet jedes Zeichen nur einmal und stoppt, wenn es ein Duplikat findet. Ich denke tatsächlich, dass die von mir zitierte Stack-Overflow-Antwort noch besser wäre, weil sie einen einzigen Befehl (Match) mit einem Regexp verwendet. Es ist auch linear, obwohl es eine gute Regexp gibt, die Duplikate zurückgibt, die ich nicht kenne. –

+0

Wenn Sie nur mit ASCII zu tun haben, dann denke ich, dass die Lookup-Tabelle die beste Lösung wäre, da Sie die Zeichenfolge nur einmal durchlaufen müssen. –