題目描述
給出一個序列包含n個正整數的序列A,然后給出一個正整數x,你可以對序列進行任意次操作的,每次操作你可以選擇序列中的一個數字,讓其與x做按位或運算。你的目的是讓這個序列中的眾數出現的次數最多。
請問眾數最多出現多少次。
輸入
輸入第一行僅包含兩個正整數n和x,表示給出的序列的長度和給定的正整數。
(1<=n<=100000,1<=x<=1000)
接下來一行有n個正整數,即這個序列,中間用空格隔開。(1<=a_i<=1000)
輸出
輸出僅包含一個正整數,表示眾數最多出現的次數。
樣例輸入
5 2
3 1 3 2 5
樣例輸出
3
思路分析:
從題目中提取出兩點:
1、可與x按位與運算操作,也可不變
2、統計處理后的數組中,出現次數最多的數字的出現次數,即眾數出現的次數。
如1:java中直接可以用“|”或運算符對兩個整數進行或運算。
如2:
①用一個數組,記錄下原數組個數字出現的次數,因題目中要求1<=n<=100000,所以這里可以創建一個長度為100000的數組,來統計沒個數字出現的次數。
②數組里的值是對應下標出現出現的次數,例如count[30]的值就是30這個數出現的次數。
③統計過程中,並用變量max記錄下最大的值。
④再將這個數與x進行或運算,如果相同,則不做任何操作,如果不同,則將或運算后的數字出現的次數+1,並與max進行比較,記錄下當前最大值。
⑤循環結束,得到的數組是經過變換后,每個數最多能出現的次數,那max就是出現次數最多的數字的出現次數,即眾數出現的次數。
注:為什么題目中描述可以進行任意次操作,我在這里只進行一輪或運算,了解或運算原理的同學應該知道,與一個數相或1次和n次無任何區別,所以相或多次是多此一舉,只需一輪就能解決問題。
舉例:
原數組:[3 3 4 2 5 6 7]
x為4,
重復上訴思路中的步驟:

從上圖中可以看出,經過與4相或后統計,7出現的次數最多,所以最終輸出的就是7出現的次數,即3。
在這,可能有人會問,為什么要把原數組和相或之后的數組中某個數出現的次數統計在一塊,
從圖中可以看出,統計到的每一個數,都是由不同的數(原數或者相或之后的數)得到的,所以統計原數組及去掉重復后的相或的結果,是經過變換后每個數最多能出現的次數。
java 代碼如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int x = sc.nextInt(); int[] arr = new int[n]; int max = 0; int y = 0; int[] count = new int[1000000]; for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); count[arr[i]]++; if(count[arr[i]]>max) max = count[arr[i]]; y= arr[i]|x; if(y!=arr[i]) { count[y]++; if(count[y]>max) max = count[y]; } } System.out.println(max); } }
