巧妙的位運算解決重複資料出現問題

2021-09-29 06:03:59 字數 1358 閱讀 5539

題目描述:1到1000這1000個數放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其他均只出現一次,找出這個重複的值。

解法1:巧妙使用位運算

public static void main(string args) 

//陣列的最後乙個元素是隨機數 就是和前面重複的那個數k 模擬這個重複的數字出現在末尾 實際不一定 但是對於演算法不影響

a[a.length - 1] = new random().nextint(n - 1) + 1;

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

system.out.println(); //打出換行

int x = 0;

for (int i = 1; i < n ; i++)

for (int i = 0; i < n; i++)

system.out.println(x);

}}

解析:上述演算法等價於:1

解法2:使用輔助陣列

public static void main(string args) 

//陣列的最後乙個元素是隨機數 就是和前面重複的那個數k 模擬這個重複的數字出現在末尾 實際不一定 但是對於演算法不影響

a[a.length - 1] = new random().nextint(n - 1) + 1;

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

system.out.println(); //打出換行

// 開闢乙個輔助陣列空間 每乙個陣列元素儲存的是 原來陣列中對應的元素出現的次數 有點像桶排序的計數器

int helper=new int[n];

for(int i=0;i總結:

第一種解法的感悟:此種解法就是要構造k,使其出現次數為奇數次,其餘的資料出現次數都是偶素次,

那麼連續的疑惑操作之後,偶數次出現的資料都沒了,剩下的就是奇數次出現的資料k 但是侷限於資料必須連續

第二種解法的感悟:以空間換時間 如果原資料**現了很大的資料 那麼就必須要構造乙個很大的輔助陣列 但是這種方法適合通用 不必要求資料連續性

題目描述:某乙個陣列裡面只有乙個數k出現了一次,其餘的都出現了2次,找出這個數。

public static void main(string args) ;

int x=0;

for(int i=0;isystem.out.println(x); }

//解析:所有出現偶數次的資料 都會在連續的異或之後消掉,只剩下出現奇數次的資料

多表left join出現的重複資料問題

最近在做乙個報表,比較複雜,大體是乙個主表a,子表b,子表c,子表d,統計這3個主表對應的資料。一開始我直接用left join 進行關聯,結果統計的資料大了,結果發現,資料有重複,left join 關聯時,如果u有2個,c有2個,b的資料會重複,這樣資料會變多,在如果個,d也有的話,資料又有很多...

位運算解決只出現一次的數字

1.有一組資料,只有乙個數字是出現一次,其他是兩次,請找出這個數字。public class test int ret 0 for int i 0 i num.length i system.out.println ret 解題關鍵 a.0與任何數字進行異或運算結果都是那個數本身 b.相同數字異獲結...

防止頁面重複提交,插入重複資料的解決辦法

新做的物業收費系統,當使用者點選收費按鈕的時候,如果點選多次會生成兩張收款單,發現問題後通過 在按鈕click的js事件裡面加了 lnkcharge.attributes onclick this getpostbackeventreference this lnkcharge this.disab...