我正在測驗一些識別字謎的方法,我發現了一個讓我措手不及的情況。我發現使用 XOR 是可能的,所以我使用 XOR 運算子對其進行了測驗。這是我的代碼:
public static void main(String[] args) {
// TODO code application logic here
String s1 = "pe";
String s2 = "ep";
System.out.println(isAnagram(s1, s2));
}
private static boolean isAnagram(String firstString, String secondString)
{
int control = 0;
System.out.println("Comparing: " firstString " and " secondString);
for (int i = 0; i < firstString.length(); i ) {
control = control ^ firstString.charAt(i);
}
for (int i = 0; i < secondString.length(); i ) {
control = control ^ secondString.charAt(i);
}
System.out.println("Control: " control);
return (control == 0);
}
當 2 個字串具有相同的字符集時,即使它們的順序不同,控制變數也為 0,將 true 回傳到 anagram。但是,當 2 個字串不同時,控制元件的值 > 0 回傳 false 到 anagram。我嘗試使用許多單詞,其中大多數都有效,但由于某種原因,它經常出現一些奇怪的情況,例如,“v”和“ils”對 anagram 或“tat”和“atata”回傳 true。
我想了解為什么會發生這種情況以及我應該怎么做才能不再出現這種情況。
uj5u.com熱心網友回復:
簡而言之,您使用的演算法將不起作用。由于 XOR 是關聯的和可交換的(例如,加法),因此對字串中的所有字符進行 XOR 運算會產生相同的值,無論您執行 XOR 的順序如何。同樣,無論您執行加法的順序如何,您都會在陣列中獲得相同的值總和。
但是,也像加法一樣,XOR 會丟棄資訊。您不能從結果回傳到原始值:1 3 = 2 2 = 0 4. 與 XOR: 類似1^3 = 6^4 = 0^2。
XOR 的一個特殊特性是a ^ a = 0對于任何 a;也a ^ 0 = a。(這些陳述句是相關的。)所以你總是可以洗掉成對的相同字符;的 XOR 組合與atata的組合相同,也與 的組合tat相同a。
uj5u.com熱心網友回復:
因此,由于按位運算子的功能如何,您將繼續遇到這些問題。v 的 acsii 為 01110110,i 的 acsii 為 01101001,l 的 acsii 為 01101100,s 的 acsii 為 01110011。
這是導致回傳 00000000 的逐行比較。
v - 01110110
i - 01101001
new:00011111
l - 01101100
new:01110011
s - 01110011
new:00000000
每個“新”都是您的控制和導致 00000000 或您的真實結果的單獨比較。
uj5u.com熱心網友回復:
這可以通過一個回圈來解決:
private static boolean isAnagram(String firstString, String secondString)
{
int control = 0;
System.out.println("Comparing: " firstString " and " secondString);
for(int i = 0; i < firstString.length(); i ) {
control ^= firstString.charAt(i) ^ secondString.charAt(i);
}
System.out.println("Control: " control);
return (control == 0);
}
演算法:
讓x成為第一個字串字符的陣列。
設為y第二個字串字符的陣列。
讓我們c成為控制者。
演算法:

注:以上有錯別字。它應該是“如果 c = 0”。
例子:
讓x = (a b c),y = (c b a)和c = 0.
在i = 0:
c = 00000000 ^ (01100001 ^ 01100011) = 00000000 ^ 00000010 = 00000010
在i = 1:
c = 00000010 ^ (01100010 ^ 01100010) = 00000010 ^ 00000000 = 00000010
在i = 2:
c = 00000010 ^ (01100011 ^ 01100001) = 00000010 ^ 00000010 = 00000000
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/427013.html
上一篇:ValueError:無法擠壓dim[1],預期維度為1,'{{nodeSqueeze}}=Squeeze[T=DT_FLOAT,squeeze_dims=[-1]]得到60
下一篇:查找多邊形的層次結構
