Leetcode 判断字符是否唯一
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例 1:
1 2
   | 输入: s = "leetcode" 输出: false 
   | 
 
示例 2:
限制:
0 <= len(s) <= 100  
s[i]仅包含小写字母 
- 如果你不使用额外的数据结构,会很加分。
 
Related Topics
位运算哈希表字符串排序 
👍 324
👎 0
ans:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
   | 不适用数据结构 则使用位运算最合适         分别是  (num & (1 << index)) != 0 以及 num |= (1 << index),读者可先看完代码,有不理解的再看下我重点讲解的两行代码。            
  index    1 << index                   解释   0    0000 0001 << 0       1左移 0 位为 0000 0001 = 1   1    0000 0001 << 1       1左移 1 位为 0000 0010 = 2   2    0000 0001 << 2       1左移 2 位为 0000 0100 = 4   3    0000 0001 << 3       1左移 3 位为 0000 1000 = 8                       ......   7    0000 0001 << 7       1左移 7 位为 1000 0000 = 128           研究 num & (1 << index)           首先1 << index 由 一个 1 和多个 0 组成,num 是 int 型,假设 index = 1,即将 1 左移一位,此时 1 << index 为 ... 0000 0010,任何数 & 0 都为 0,所以num & (1 << 1)表示的是 num 化为二进制后的第二位与 1 << index 的第二位 & 的结果。 假设 num 为 0, 则 (... 0000 0000 & ... 0000 0010) = 0,从哈希表的角度看就是 num 的第二位未被使用,假设位数对应26个小写字母,第二位为b,即hash中不存在b;
  假设 num 为 2,则 (... 0000 0010 & ... 0000 0010) = 2,从哈希表的角度看就是 num 的第二位已被使用,假设位数对应26个小写字母,第二位为b,即hash中已存在b;
  研究 num |= (1 << index)     
     num    | 1 << index     0     |     1     = 1 0000 0000 | 0000 0001 = 1
      1     |     1     = 1 0000 0001 | 0000 0001 = 1
      2     |     1     = 3 0000 0010 | 0000 0001 = 3           当 num = 2 时,表明字母 b 已出现过,当 index = 0,1 << index 表示左移 0 位,对应字母 a,此时num |= (1 << index) 为 3,从哈希表的角度来看,此时 num 相当于已存在字母 a 和 b, 此时 num & (1 << 0) 为 1 不等于 0 ,表明字母 a 已经存在,返回false     
 
 
   | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
   | class soluaction{          public boolean getResult(String str){         int length = str.length();         if(length > 26) return false;                 int num =0;         for(int i=0;i< len ;i++){             char c = str.charAt(i);             int index = c -'a';             if((num & 1 << index) !=0){                                  return false;             }else{                                  num != 1 << index;             }                        }         return true;     }           }
  | 
 
                
                __END__