【问题标题】:Implement an algorithm to determine if a string has all unique characters using bit twiddling使用位旋转来实现一个算法来确定一个字符串是否具有所有唯一字符
【发布时间】:2012-08-15 19:22:58
【问题描述】:

我将如何最好实现一个接受 String 参数并返回 truefalse 的 Java 函数,具体取决于 String 是否由所有不同的字符组成。

这是一道面试题。实现应该使用位掩码来存储字符的出现,而不是其他辅助数据结构。

注意:使用位掩码的要求使这个问题不同于:

根据要求,这是我迄今为止所做的努力。如果可能,请现在重新打开问题:

public static boolean hasAllUniqueCharactersUsingBitMasking(String string) {
  final int length = string.length();
  final int nBitsToStoreAllUnicodeCharacters =
      (int) Math.ceil(Math.log(Character.MAX_CODE_POINT) / Math.log(2d));
  BitSet bitSet = new BitSet(nBitsToStoreAllUnicodeCharacters);
  for (int i = 0; i < length; i++) {
    char c = string.charAt(i);
    if (bitSet.get(c)) {
      return false;
    }
    bitSet.set(c);
  }
  return true;
}

【问题讨论】:

  • 这是一个面试问题的答案。
  • 请原谅,问题是什么?
  • 您可以将所有字符添加到 BitSet 中,您可以检查大小是否与长度匹配,或者是否已经设置了任何位。
  • 我重新表述了这个问题。重新打开?
  • 你得到了我的投票。我不明白为什么要对 bitset 的大小进行复杂的计算——一个简单的 new BitSet() 就可以了。

标签: java


【解决方案1】:

根据Cracking the Coding Interview

public static boolean isUniqueChars(String str) {
  if (str.length() > 256) { 
    return false;
  }
  int checker = 0;
  for (int i = 0; i < str.length(); ++i) {
    int val = str.charAt(i) - ‘a’;
    if ((checker & (1 << val)) > 0) return false;
    checker |= (1 << val);
  }
  return true;
}

【讨论】:

  • 这对有效字符的范围做了一个强有力的假设......Unicode比这大得多。
  • ...这绝不意味着这不是面试官的意图。在我看来,这是对另一个愚蠢的面试问题的正确答案。
  • 但无论如何,使用long[] 和多一点逻辑,这种方法可以相当容易地扩展到更广泛的范围。
  • 实际上,既然问题说我们可以使用“使用位掩码的辅助数据结构”,我会将其解释为允许使用 BitSet。每个代码点一个索引,然后就可以了。
  • @yshavit 我会假设通过“数据结构”他们不允许一个成熟的类。措辞似乎针对数组。
【解决方案2】:

这是在 Java 中使用 BitSet 类的另一种解决方案。该程序适用于 ASCII 字符集字符串,并且不限制字符串必须为小写或大写。还使用 BitSet 类可以轻松使用和理解按位运算。

public static boolean isUniqueStringUsingBitVectorClass(String s) {

        final int ASCII_CHARACTER_SET_SIZE = 256;

        final BitSet tracker = new BitSet(ASCII_CHARACTER_SET_SIZE);

        // if more than  256 ASCII characters then there can't be unique characters
        if(s.length() > 256) {
            return false;
        }

        //this will be used to keep the location of each character in String
        final BitSet charBitLocation = new BitSet(ASCII_CHARACTER_SET_SIZE);

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

            int charVal = s.charAt(i);
            charBitLocation.set(charVal);

            if(tracker.intersects(charBitLocation)) {
                return false;
            }

            tracker.or(charBitLocation);

            charBitLocation.clear(); //clear the individual character tracker for next iteration in the loop

        }

        return true;

    }

【讨论】:

    【解决方案3】:
    public static boolean isUniqueCharsBitSet(String str) {
    
    if (str.length() > 256) {
            return false;
        }
    
        BitSet set = new BitSet();
        for (int i = 0; i < str.length(); ++i) {
            int val = str.charAt(i) - 'a';
            if (!(set.get(val))) {
                set.set(val);
            } else {
                return false;
            }
    
        }
        return true;
    

    }

    【讨论】:

    • 欢迎堆砌,这里你不用发答案但你也要解释一下
    猜你喜欢
    • 2017-12-12
    • 2013-06-25
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    相关资源
    最近更新 更多