2017-07-09 35 views
-1

有人可以請解釋這段代碼的工作,它告訴如果給定的單詞是唯一的或不是?請解釋說明給定單詞是否唯一的代碼片段?

public static boolean isUniqueChars(String str) { 
    if (str.length() > 128) { 
     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; 
} 

我不明白什麼是以下兩行發生的事情:

if ((checker & (1 << val)) > 0) return false; 
checker |= (1 << val); 

謝謝!

+0

這是一個位掩碼。 – SLaks

回答

0

檢查器的行爲像一個布爾數組。這個數組的每個元素都存儲一個字符是否被使用。 因此,checker|= (1 << Val)將一個字符存儲到array.and if語句將檢查此char是否被使用。

但似乎很奇怪:< 128比較。因爲int的長度是32位。

+0

謝謝,這究竟是什麼:'| ='?它究竟如何像一個數組一樣被聲明爲int? – rowana

+0

我在想128的檢查是因爲總共有128個獨特的字符可能是? – rowana

0

要了解它是如何在位水平的工作放在Integer.toBinaryString()和檢查。基本上,無論何時在任何整數值中使用位智能運算符,實際操作都會在各自的二進制值上發生。

public static boolean isUniqueChars(String str) { 
     if (str.length() > 128) { 
      return false; 
     }  int checker = 0; 
     for (int i = 0; i < str.length(); i++) { 
      int val = str.charAt(i) - 'a'; 
      System.out.println("Actual Value " + val); // ASCII substraction 
      System.out.println("Actual Value in Binary " + Integer.toBinaryString(val)); 
      System.out.println("Left Shift Value in Binary " + Integer.toBinaryString(1<<val)); 
      System.out.println("Operator Value is" + Integer.toBinaryString(checker & (1 << val)))); 
      if ((checker & (1 << val)) > 0) 
       return false; 
      checker |= (1 << val); // checker = checker | (1<<val) 
      System.out.println("Checker Value in Binary " + Integer.toBinaryString(checker)); 
     } 
     return true; 
    } 

運行此並檢查那些打印語句,然後您可以確定位明智的運算符是如何工作的。

邏輯上: 1是每次左移ASCII替換值,然後BIT(或)與以前的檢查器值完成。如果當前和檢查器值BIT(或)返回> 0,這意味着這兩個值的某個位的位置都爲1,因此它的重複字符。我知道這聽起來有點複雜,但花時間調試它。

希望它可以幫助你。