生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法--数组中出一次的数字
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數組中出現一次的數字
-
題目:一個整型數組里面除了一個數字以外,其他數字都出現了兩次。找出這個出現一次的數字,時間復雜度O(n),空間復雜度O(1)
-
如上題中最簡單的方法就是一次循環統計,之后在循環判斷出值出現一次的數字,但是空間復雜度會達到O(n)達不到題目中的要求,最直觀的方法往往不是我們需要找的最優解
-
題目中強調了只有一個數字出現了一次,其他都是2次,強調的1次和2次肯定會是有用的條件,我在之前的文章:數據結構與算法–位運算中有詳細解釋了異或相關操作以及應用,相同的兩個數據異或得到的永遠是0
-
我們可以利用異或逐個去對每個數據進行操作,得到最終的數據就是我們需要的獨立出現的數據,
-
如上分析有如下代碼:
public static int findOne(int[] array
){if(array
== null
){return 0;}int resultInt
= 0;for (int i
= 0; i
< array
.length
; i
++) {resultInt
^= array
[i
];}return resultInt
;}
- 以上實現我們用一次遍歷得到結果,時間復雜度O(n),空間復雜度O(1)
變種題型,如果有兩個不同的數,求這兩個
public class FindShowOnceInArray {public static void main(String
[] args
) {int[] array
= new int[]{2,998,3,77,3,2,5,5};int result
= 0;for (int i
= 0; i
< array
.length
; i
++) {result
^= array
[i
];}int[] resultTemp
= findOnceNum(array
);System
.out
.println(resultTemp
.length
+ ": "+ resultTemp
[0] + ": "+ resultTemp
[1]);}public static int[] findOnceNum(int[] array
){if(array
== null
|| array
.length
<= 2){return array
;}int resultInt
= 0;for (int i
= 0; i
< array
.length
; i
++) {resultInt
^=array
[i
];}System
.out
.println(resultInt
);int position
= checkoutPosition(resultInt
);System
.out
.println(position
);int[] arrayIsone
= new int[array
.length
];int positionOne
= 0;int[] arrayNotOne
= new int[array
.length
];int positionNotOne
= 0;int positionNum
= 1;positionNum
<<=position
;System
.out
.println(positionNum
);for (int i
= 0; i
< array
.length
; i
++) {if((array
[i
]&positionNum
) == positionNum
){arrayIsone
[positionOne
] = array
[i
];positionOne
++;}else {arrayNotOne
[positionNotOne
] = array
[i
];positionNotOne
++;}}int[] resultTemp
= new int[2];int oneResult
= 0;int twoResult
= 0;for (int i
= 0; i
< positionOne
; i
++) {oneResult
^=arrayIsone
[i
];}resultTemp
[0]=oneResult
;for (int i
= 0; i
< positionNotOne
; i
++) {twoResult
^=arrayNotOne
[i
];}resultTemp
[1] = twoResult
;return resultTemp
;}public static int checkoutPosition(int resultInt
){int position
= 0;for(;resultInt
> 0; resultInt
>>=1){if((resultInt
&1) == 1){return position
;}position
++;}return position
;}
}
- 如上實現中利用異或運算的特性來篩選出不同的兩個數據,并且利用 與 運算倆排查 第n位上的數據是否為1,用2次循環得到結果,時間復雜度為O(n),但是空間復雜度也是O(n)
- 我們可以對他進行如下改造,不存儲直接運算得出結果,如下
public static int[] findOnceNumON(int[] array
){if(array
== null
|| array
.length
<= 2){return array
;}int resultInt
= 0;for (int i
= 0; i
< array
.length
; i
++) {resultInt
^=array
[i
];}System
.out
.println(resultInt
);int position
= checkoutPosition(resultInt
);System
.out
.println(position
);int positionOne
= 0;int positionNotOne
= 0;int positionNum
= 1;positionNum
<<=position
;System
.out
.println(positionNum
);for (int i
= 0; i
< array
.length
; i
++) {if((array
[i
]&positionNum
) == positionNum
){positionOne
^=array
[i
];}else {positionNotOne
^=array
[i
];}}int[] resultTemp
= new int[2];resultTemp
[0]= positionOne
;resultTemp
[1] = positionNotOne
;return resultTemp
;}
- 如上實現,我們得到時間復雜度O(n),空間復雜度O(n)的實現方案
上一篇:數據結構與算法–二叉樹的深度問題
下一篇:數據結構與算法–有序數組中找出和為s的兩個數字
總結
以上是生活随笔為你收集整理的数据结构与算法--数组中出一次的数字的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。