何时用256初始化数组

时间:2015-10-01 02:28:00

标签: java c++ arrays

我正在查看编码采访书解决方案的破解并注意到以下问题:

实施算法以确定字符串是否具有所有唯一字符。如果您不能使用其他数据结构怎么办?

这是提供的解决方案之一:

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

为什么char_set数组的初始化大小为256?我以为这是因为有128个ascii字符,但我不确定。此外,这个解决方案似乎是在Java中,但如果在C ++中完成,那么初始大小也是必要的吗?

4 个答案:

答案 0 :(得分:6)

  

我原以为是因为有128个ascii字符,但我不确定。

没有。使用扩展的ASCII码,总共有256个字符。这就是256的原因。

http://www.asciitable.com/

256给出的理由外,请注意com /

请注意,正如Erwin Bolwidt所说,代码在任何情况下都是不完整的,因为Java&#34;字符&#34;不是ASCII也不是扩展ASCII。它们是一个16位的Unicode字符&#34;,所以数组应该是新的布尔值[65536]

答案 1 :(得分:1)

扩展的ASCII字符集中有2 ^ 8 = 256个字符。

在这里查看。 http://www.ascii-code.com/

解决方案告诉你1和0只能是两个值。这就是为什么它使用布尔值的原始值数组。如果没有初始化,布尔变量总是为FALSE。

C ++允许

bool arr[256] = {};

数组的一个很好的例子:

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

并将结果表示为:

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

答案 2 :(得分:1)

Btw代码是用Java编写的。

boolean[] char_set = new boolean[256]

将是

bool* char_set = new bool[256]

在C ++中

答案 3 :(得分:0)

另一种方法是蛮力,但这不是最佳解决方案。

您可以在外部循环中使用两个for循环

for(int i=0; i<str.length(); i++)

内部循环就像

for(int j=i+1; j<str.length(); j++)

两个值的比较将得出答案

if(str.charAt(i) == str.charAt(j))

此外,您可以检查字母,如果只检查26个英文字母(a到z或大写A到Z)有限制,则可以使用