78 子陣列按位或操作

2021-09-19 05:05:51 字數 1274 閱讀 7185

題目描述:

我們有乙個非負整數陣列 a。

對於每個(連續的)子陣列 b = [a[i], a[i+1], …, a[j]] ( i <= j),我們對 b 中的每個元素進行按位或操作,獲得結果 a[i] | a[i+1] | … | a[j]。

返回可能結果的數量。 (多次出現的結果在最終答案中僅計算一次。)

示例 1:

輸入:[0]

輸出:1

解釋:只有乙個可能的結果 0 。

示例 2:

輸入:[1,1,2]

輸出:3

解釋:可能的子陣列為 [1],[1],[2],[1, 1],[1, 2],[1, 1, 2]。

產生的結果為 1,1,2,1,3,3 。

有三個唯一值,所以答案是 3 。

示例 3:

輸入:[1,2,4]

輸出:6

解釋:可能的結果是 1,2,3,4,6,以及 7 。

1 <= a.length <= 50000

0 <= a[i] <= 10^9

這道題如果使用暴力解法會超時,因此考慮使用一些技巧,首先就是如果獲取這些子陣列,這裡呢,用乙個dp陣列,長度為a.length,那麼dp[i]是a[i],dp[i-1]等於dp[i] | dp[i-1]

修改了一下,這裡的dp[i] 總是大於等於dp[i-1]的

忽略字形…

**如下

class solution 

// 用乙個dp[i]表示的是或之後的值

int dp = new int[a.length];

// 用map表示是否存在了或值,如果存在則不計數

mapmap = new hashmap<>();

// 用result表示的計數,當然這裡也可以直接返回map.size

int result = 0;

dp[0] = a[0];

map.put(dp[0],dp[0]);

for (int i = 1; i < a.length; i++)

dp[j] = tem;

map.put(dp[j],dp[j]);

}} return map.size(); }}

leetcode 898 子陣列按位或操作

我們有乙個非負整數陣列 a。對於每個 連續的 子陣列 b a i a i 1 a j i j 我們對 b 中的每個元素進行按位或操作,獲得結果 a i a i 1 a j 返回可能結果的數量。多次出現的結果在最終答案中僅計算一次。示例 1 輸入 0 輸出 1 解釋 只有乙個可能的結果 0 示例 2 ...

通過按位與和按位或操作

通過按位與和按位或操作來拉高或者拉低某位的電平,用這兩種運算可以讓其他為的電平狀態不受影響。1.按位或 操作,可以實現拉高電平 0 1,即對應位至少有一者為1運算結果為1,都為0才為0 將需拉高電平的低電平位0與1進行按位或操作,0 1 1即可拉高電平。如果原操作為也有為0的,為保證其電平不改變,其...

詳解「 按位與 按位或 按位異或」

按位與 按位或 按位異或 1.按位與運算 按位與運算子 是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 否則為0。參與運算的數以補碼方式出現。例如 9 5可寫算式如下 00001001 9的二進位制補碼 00000101 5的二進位制補碼 0000...