Java 破解编码面试,第四版,1.1

Java 破解编码面试,第四版,1.1,java,data-structures,Java,Data Structures,我在破解编码面试时遇到了以下问题,1.1: 实现一个算法来确定字符串是否具有所有唯一字符。如果不能使用其他数据结构怎么办? 这是本书的解决方案: 以下是我的解决方案: public boolean allUnique(String input) { HashSet<Character> set = new Hashset<Character>(); char c; for (int i = 0; i < input.length(); i++) { c

我在破解编码面试时遇到了以下问题,1.1:

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

这是本书的解决方案:

以下是我的解决方案:

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;
public boolean allUnique(字符串输入){
HashSet=newhashset();
字符c;
对于(int i=0;i
我的解决方案有效吗?它的效率有多高?我还想知道是否有人能解释ASCII以及它与这个问题的关系,因为这本书的解决方案中简单地提到了ASCII。这就是为什么我们能够将字符串中的每个字符类型转换为整数的原因吗


谢谢!

要演示如何不使用阵列(不知道这是否真的很快),您可以:

函数布尔运算(字符串输入){
对于(int i=0;i-1){return false;}
}
返回true;
}

以上内容未经测试,但应能正常工作。“i”可能需要是“i+1”才能使其超过当前字符。但是我认为“I”应该可以工作。

如果不能使用其他数据结构,该怎么办?
您的问题似乎涵盖了许多可能的答案,您的代码看起来应该运行。也许这是开的。ASCII只是一个字符集。就像Unicode是一个不同的字符集一样。ASCII通常在0-127范围内使用,而128-256通常不使用。另外,由于您可以有一个关联数组,使用它并只增加每个位置不是更好吗?如果数组项大于一(1),则有一个重复项。只是一个想法。(编辑):啊!布尔数组也一样好。:-)也可以不使用数组而只使用indexOf()函数。一个简单的双用途方法将首先查找给定字符的第一个实例,然后查找任何其他实例。看见(编辑)我考虑过了,您实际上只需要一个indexOf()函数,并使用可选的开始信息。如果您找到第二个字符,则存在重复字符。还有一个想法:
String#indexOf
实现了线性搜索,因此您的代码将对
input
中的每个字符进行线性搜索。您的解决方案是一个嵌套的for循环,其中内部for循环是
for(int j=0;jCorrect),但它只测试每个字符一次,如果发现重复的字符就会停止。我实际上认为我引用的堆栈溢出答案会更好,因为它使用单个命令(match)使用regexp。它也是线性的,尽管可能有一个好的regexp会返回我不知道的重复项。如果您只处理ASCII,那么我认为查找表方法将是最好的解决方案,因为您只需要在字符串上迭代一次。而且它不“只测试每个字符一次”,平均来说,它会比较第一个和第二个字符一次,第三个字符两次,第四个字符三次,…,第n个字符n-1次。@JonnyHenly:我很乐意,但我不得不离开。我会再考虑一下,如果我有什么想法,我会把它贴在那里。:-)
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;
 }