我正在查看编码采访书解决方案的破解并注意到以下问题:
实施算法以确定字符串是否具有所有唯一字符。如果您不能使用其他数据结构怎么办?
这是提供的解决方案之一:
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 ++中完成,那么初始大小也是必要的吗?
答案 0 :(得分:6)
我原以为是因为有128个ascii字符,但我不确定。
没有。使用扩展的ASCII码,总共有256个字符。这就是256的原因。
除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)有限制,则可以使用