2015-10-01 9 views
5

Ich war auf der Suche durch die Rissbildung der Codierung Interview Buch Lösungen und bemerken folgendes Problem zu initialisieren:Wenn ein Array mit 256

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

Dies war einer der angebotenen Lösungen:

public static boolean isUniqueChars2(String str) { 
    boolean[] char_set = new boolean[256]; 
    for (int i = 0; i < str.length(); i++) { 
     int val = str.charAt(i); 
     if (char_set[val]) return false; 
     char_set[val] = true; 
    } 
    return true; 
} 

Warum ist die char_set Array mit einer Größe von 256 initialisiert? Ich dachte, dass es weil 128 ASCII-Zeichen sind, aber ich bin mir nicht sicher. Auch diese Lösung scheint in Java zu sein, aber wäre eine anfängliche Größe auch notwendig, wenn dies in C++ getan wurde?

+0

Ihr Code sein, wenn die einzigen gültigen Werte 8 Bits sind. Weil 2^8 256 ist. –

+0

@EliottFrisch Können Sie Beispiele für Zeichen angeben, die möglicherweise nicht gültig sind? – loremIpsum1771

+1

Etwas wie "" könnte ein Problem sein. –

Antwort

5

Ich dachte, dass es weil 128 ASCII-Zeichen gibt, aber ich bin mir nicht sicher.

Nein. Bei erweiterten ASCII-Codes gibt es insgesamt 256 Zeichen. Das ist der Grund für die 256.

http://www.asciitable.com/

Neben dem gegebenen Grund für 256 Bitte beachten Sie, dass com/

Beachten Sie, dass als Erwin Bolwidt sagte der Code bestenfalls unvollständig ist in jedem Fall, weil Java "Zeichen" nicht ASCII oder erweitertes ASCII sind. Sie sind "ein 16-Bit-Unicode-Zeichen", daher sollte das Array neu sein. Boolean [65536]

+0

Müssten Sie es auf diese Weise initialisieren, wenn die Lösung in C++ getan wurde? – loremIpsum1771

+0

@ LoremIpsum1771 Ich bin kein C++ - Guru, aber es scheint ja, Sie müssen die Länge angeben, während das Array selbst erklärt. –

+0

Aber der Code ist bestenfalls unvollständig, weil Java "Zeichen" weder ASCII noch erweitertes ASCII sind. Sie sind "ein 16-Bit-Unicode-Zeichen", daher sollte das Array "new boolean [65536]" sein. –

1

Es gibt 2^8 = 256 Zeichen in einem erweiterten ASCII-Zeichensatz.

Überprüfen Sie es hier. http://www.ascii-code.com/

Lösung sagt Ihnen über 1 und 0 kann nur zwei Werte sein. Deshalb verwendet es ein primitives Werte-Array von booleschen Werten. Ohne Initialisierung ist die boolesche Variable immer FALSE.

C++ ermöglicht

bool arr[256] = {}; 

ein gutes Beispiel für Arrays:

#include <iostream> 

using namespace std; 

int main() 
{ 
bool test1[16] = { false }; 
bool test2[16] = { true }; 
bool test3[16]; 

cout << "Test1 - Init to false" << endl; 
for (size_t i = 0; i < sizeof(test1)/sizeof(test1[0]); ++i) 
    cout << test1[i]; 

cout << endl << "Test2 - Init to true" << endl; 
for (size_t i = 0; i < sizeof(test2)/sizeof(test2[0]); ++i) 
    cout << test2[i]; 

cout << endl << "Test3 - Uninitialized" << endl; 
for (size_t i = 0; i < sizeof(test3)/sizeof(test3[0]); ++i) 
    cout << test3[i]; 

cout << endl; 
} 

und gibt die Ergebnisse als:

Test1 - Init to false 
0000000000000000 
Test2 - Init to true 
1000000000000000 
Test3 - Uninitialized 
12024619195255127009671929525512700 
1

Btw der Code ist in Java.

boolean[] char_set = new boolean[256] 

würde funktioniert nur

bool* char_set = new bool[256] 

in C++