您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何實現兩個異或相等數組的三元組數目”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何實現兩個異或相等數組的三元組數目”吧!
給你一個整數數組
arr
。現需要從數組中取三個下標
i
、j
和k
,其中(0 <= i < j <= k < arr.length)
。
a
和b
定義如下:
a = arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]
b = arr[j] ^ arr[j + 1] ^ ... ^ arr[k]
注意:^ 表示 按位異或 操作。
請返回能夠令
a == b
成立的三元組 (i
,j
,k
) 的數目。
力扣鏈接:https://leetcode-cn.com/problems/count-triplets-that-can-form-two-arrays-of-equal-xor
示例 1:
輸入:arr = [2,3,1,6,7] 輸出:4 解釋:滿足題意的三元組分別是 (0,1,2), (0,2,2), (2,3,4) 以及 (2,4,4)
示例 2:
輸入:arr = [1,1,1,1,1] 輸出:10
示例 3:
輸入:arr = [2,3] 輸出:0
/* 方法一:不假思索的暴力循環。沒什么好說的,也沒什么好看的。 */ class Solution { public int countTriplets(int[] arr) { int res=0; int n1,n2; for(int i =0;i<arr.length;i++){ for(int j=i+1;j<arr.length;j++){ for(int k=j;k<arr.length;k++){ n1 = arr[i]; int ii = i + 1; while(ii<j){ n1 = n1^arr[ii]; ii++; } n2 = arr[j]; int jj = j+1; while(jj<=k){ n2 = n2 ^ arr[jj]; jj++; } if(n1 == n2){ res++; } } } } return res; } }
/* 方法二: 思路: 當a==b時,a^b=0即 arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]^arr[j] ^ arr[j + 1] ^ ... ^ arr[k] = 0; 在滿足上述條件的i和k之間任意取一個j,這個j的左右異或值都是相等的。 */ class Solution { public int countTriplets(int[] arr) { int len = arr.length; int res = 0; for(int i = 0; i < len - 1; i ++){ int sum = 0; for(int k = i; k < len ; k ++){ sum ^= arr[k]; if (sum == 0 && k > i) { res += (k - i); } } } return res; } }
總結:兩個值(i,k)之間的所有數的異或值等于0,則中間任意一個數的左右兩邊的異或值相等[i,j)==[j,k]。
感謝各位的閱讀,以上就是“如何實現兩個異或相等數組的三元組數目”的內容了,經過本文的學習后,相信大家對如何實現兩個異或相等數組的三元組數目這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。