日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法--数组中出一次的数字

發布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法--数组中出一次的数字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數組中出現一次的數字

  • 題目:一個整型數組里面除了一個數字以外,其他數字都出現了兩次。找出這個出現一次的數字,時間復雜度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)

變種題型,如果有兩個不同的數,求這兩個

  • 以上題型中我們用異或的方式找出了一個不同的數據,那能不能用相同的的方法解決兩個的情況。

  • 分析:

    • 還是逐個異或,我們得到的比如是兩個不同數據異或的結果
    • 如果我們能將這個數組拆分開,并且讓兩個不同的數據分布在兩個不同的數組中
    • 如果做到如上這點,我們可以套用以上的方案去解題,假設不同數據分別是n, m
    • 假設我們異或得到的數據是k, 異或的定義,相同位異或得到0,不同位異或得到1
    • 那么我們在數據 k的二進制位中任意找一位,我們找第一位是1 位置標記為position
    • 我們遍歷 數組,判斷所有數據中 position 位置是否為1,是1 則放入第一個數組,是二則放入
    • 此時n, m的position 為必然是不同的,這個時候我們就可以將n, m區分開來到兩個數組
    • 同理,相同的兩個數據z,z’,相同的position位必然是一樣,那么必然在一個數組中
    • 至此我們將兩個數據拆分開
    • 經過如上分析有如下代碼:
/*** @author liaojiamin* @Date:Created in 17:59 2021/6/28*/ 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;}/*** 找到目標數據二進制數第一位為1 的位置**/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)
  • 我們可以對他進行如下改造,不存儲直接運算得出結果,如下
/*** 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的兩個數字

總結

以上是生活随笔為你收集整理的数据结构与算法--数组中出一次的数字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。