2015-10-01 15 views
5

Tôi đang xem xét các giải pháp ghi chép mã hóa và nhận thấy vấn đề sau:Khi nào khởi tạo một mảng với 256

Thực hiện một thuật toán để xác định chuỗi có tất cả các ký tự duy nhất không. Nếu bạn không thể sử dụng cấu trúc dữ liệu bổ sung thì sao?

Đây là một trong những giải pháp cung cấp:

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; 
} 

Tại sao các mảng char_set khởi tạo với kích thước 256? Tôi đã nghĩ rằng đó là bởi vì có 128 ký tự ascii nhưng tôi không chắc chắn. Ngoài ra, giải pháp này có vẻ là trong Java, nhưng sẽ có một kích thước ban đầu cũng cần thiết nếu điều này đã được thực hiện trong C + +?

+0

Mã của bạn chỉ hoạt động nếu các giá trị chỉ có giá trị là 8 bit. Vì 2^8 là 256. –

+0

@ElliottFrisch Bạn có thể cung cấp ví dụ về các ký tự có thể không hợp lệ không? – loremIpsum1771

+1

Điều gì đó giống như '' có thể là một vấn đề. –

Trả lời

5

Tôi đã nghĩ rằng đó là vì có 128 ký tự ascii nhưng tôi không chắc chắn.

Không. Với mã ASCII mở rộng, có tổng cộng 256 ký tự. Đó là lý do cho 256.

http://www.asciitable.com/

Ngoài các lý do đưa ra cho 256, xin lưu ý com rằng/

Lưu ý rằng khi Erwin Bolwidt nói, mã là lúc tốt nhất không đầy đủ trong mọi trường hợp, vì Java "ký tự" không phải ASCII hay ASCII mở rộng. Chúng là "ký tự Unicode 16 bit", do đó mảng phải là boolean mới [65536]

+0

Bạn có cần khởi tạo nó theo cách này nếu giải pháp được thực hiện trong C++ không? – loremIpsum1771

+0

@ loremIpsum1771 Tôi không phải là một guru C++ nhưng, có vẻ như có, bạn cần phải cung cấp cho độ dài trong khi tuyên bố mảng chính nó. –

+0

Nhưng mã này là không hoàn hảo nhất trong mọi trường hợp, bởi vì "các ký tự" Java không phải là ASCII hay ASCII mở rộng. Chúng là "một ký tự Unicode 16-bit", do đó mảng phải là 'boolean mới [65536]'. –

1

Có 2^8 = 256 ký tự trong bộ ký tự ASCII mở rộng.

Kiểm tra tại đây. http://www.ascii-code.com/

Giải pháp cho bạn biết về 1 và 0 có thể chỉ có hai giá trị. Đó là lý do tại sao nó đang sử dụng một mảng giá trị nguyên thủy của boolean. Không có biến boolean khởi tạo luôn luôn là FALSE.

C++ cho phép

bool arr[256] = {}; 

một tấm gương tốt cho các mảng:

#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; 
} 

và cho kết quả như sau:

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

Btw mã là trong Java.

boolean[] char_set = new boolean[256] 

sẽ

bool* char_set = new bool[256] 

trong C++

Các vấn đề liên quan