1. 程式人生 > >資料結構——陣列(5)找出陣列中唯一重複的數(元素範圍1~1000)

資料結構——陣列(5)找出陣列中唯一重複的數(元素範圍1~1000)

這個題目本身就有一定侷限性。比如,對於陣列a[10001],其中,1000個數就是1~1000的每個數,可以任意排列,然後再多一個重複的數。題目就是怎麼求出這個特殊的重複的數。
這一類問題的解決思路主要有以下幾種:
方法一:先求和,再相減。即陣列元素值求和,然後陣列下標求和,然後二者相減,即可得到重複的數。

void xor_findDup1(int *a,int len)
{
    int sum1=0;
    int sum2=0;
    for(int i=0;i<len;i++)
    {
        sum2+=a[i];
    }
    for (int i=0;i<len
;i++) { sum1+=i; } int num=sum2-sum1; cout<<"唯一重複的數為:"<<num<<endl; }

方法二:異或法。a^a^b=b;a^a=0;a^b=1;0^b=b。該方法可先將陣列元素異或,然後將下標異或,最後將兩個異或結果異或,比如:a[1,2,3,4,2],下標為:[0,1,2,3,4]。異或最終只剩下0^2=2.

void xor_findDup2(int *a,int len)
{
    int i;
    int result =0;
    for(i=0
;i<len;i++) { result ^=a[i]; //陣列元素異或,儲存結果到result } for (i=0;i<len;i++) { result^=i; //result結果和陣列下標序號異或,最終結果依然儲存在result中 } printf("重複數字為:%d\n",result); }

方法三:點陣圖法。即用一個位去記錄資料的存放方式。不過,若陣列長度為N,則需要N位。
這種方法的思路是,設立一個長度為N的標誌陣列,並初始化為false。然後遍歷陣列,每遍歷一個數,在對應的i位置處記錄該數標誌位true,若已經是true了,說明這個數是重複的數。

void xor_findDup3(int *a,int len)
{
    int *arrFlag= (int *)malloc(len*sizeof(int));
    int i=1;
    while(i<len)
    {
        arrFlag[i] =false;
        i++;
    }

    for (i=0;i<len;i++)
    {
        if (arrFlag[a[i]]  ==false  )
            arrFlag[a[i]] =true;
        else
            printf("重複數字為:%d\n",a[i]);
    }

}

擴充套件 不是一個重複數字,而是多個重複數字的情況。
依然可以使用點陣圖法,把重複的數字都輸出即可。

相關推薦

資料結構——陣列5陣列唯一重複的數元素範圍1~1000

這個題目本身就有一定侷限性。比如,對於陣列a[10001],其中,1000個數就是1~1000的每個數,可以任意排列,然後再多一個重複的數。題目就是怎麼求出這個特殊的重複的數。 這一類問題的解決思路主要有以下幾種: 方法一:先求和,再相減。即陣列元素值求和,

java陣列中和為K的一組解動態規劃

考慮N個數的陣列A中是否存在和為K的解,可以分為考慮(N-1個數中是否有和為K的解)或者(N-1個數中是否有和為K-A[N-1]的解(解包含A[N-1]的情況))。也就是說,動態規劃方程是:P[N][K]=P[N-1][K]||P[N-1][K-A[N-1]];直接上程式碼:

微軟100題93陣列比左邊的大比右邊的小的元素

在一個int數組裡查詢這樣的數,它大於等於左側所有數,小於等於右側所有數 思路:如果一個元素師左邊最大的,又是右邊最小的,那麼就是要找的元素,所以一開始求出所有的右邊最小陣列rightmin,然後從左往右判斷截止當前元素最大的是,如果和對應的rightemin陣列中一樣

javaSE (三十二字串重複的元素並寫入檔案、模擬正版軟體使用次數期限、獲取資料夾下的全部java檔案

1、找出字串中重複的元素並寫入檔案: 問題:鍵入(或者從一個檔案中讀取)一個字串,找出字串中重複的元素並寫入檔案 思路: 鍵入字串 map儲存 寫入檔案 程式碼: package cn.njupt; /* * * 鍵入一串字元,計算每個字元出

python-進階教程-字典值最大最小元素的n種方法

0.摘要 字典作為儲存“鍵值對”的資料結構,往往不能直接進行計算,需要藉助額外的方法。 本文主要介紹多種方法,實現根據字典的值進行最大值、最小值和排序等計算。   1.使用dict.values()方法 dict.values()方法可以直接提取出字典的值,並存放在單獨

【簡單演算法】1.兩數之和,給定整數陣列和目標值,陣列2數之和等於目標值的元素

接觸了程式碼,那麼演算法始終是繞不開的一個重點。 演算法對於開發人員,在日常之中的作用很大,但是對於測試人員來說,實際編碼中用到的似乎不是很多。 不過,現在大廠的測試開發的面試,演算法是必考的,而且這也的確是你的程式碼功底的一項重要體現,學學沒壞處。 ![](https://img2020.cnblogs

Python序列出現最多的元素

運用場景 有時候我們需要統計一個序列中出現最多或者次多的元素,或者是給你一段文字,這段文字中出現最多的詞是什麼,以及每個詞出現的次數,這個在寫程式碼的初級篇大家都會遇到。 一般的做法,我肯定會用一個字典做遍歷,key 就是我們要處理的元素,然後value就是

資料結構面試題總結5——陣列陣列唯一一個出現一次的元素

問題描述:一個數組其中有一個元素出現了一次(奇次),其他元素都出現兩次(偶數次數),找出出現一次(奇次)的元素。 分析:碰到這種偶次奇次的問題,首先要想一下位運算中的異或。一個數異或本身為0,一個數異或0不變。a ^ a = 0, a ^ 0 = a。 這個題中,我們可以把

javaleetcode852 山脈陣列的封頂索引二分查詢法陣列最大值的下標Peak Index in a Mountain Array

題目描述: 我們把符合下列屬性的陣列 A 稱作山脈: A.length >= 3 存在 0 < i < A.length - 1 使得A[0] < A[1] < ... A[i-1] < A

微策略2011校園招聘筆試題陣列兩個只出現一次的數字

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

LeetCode:581. Shortest Unsorted Continuous Subarray陣列不需要排序的最小陣列

      Given an integer array, you need to find one continuous subarray that if you only sort this subarray in ascending order

LeetCode:53. Maximum Subarray陣列中和最大的陣列

         Given an integer array nums, find the contiguous subarray (containing at least one number) which has the l

陣列只出現了一次的數字Java

找出陣列中只出現了一次的數字題目題目分析方法1方法2方法3程式碼實現總結 題目 給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個 元素均出現兩次。找出那個只出現了一次的元素。 示例 示例1:輸入:[2,2,1] 輸出:1 示例2:輸入:[4,1,2

資料結構-陣列-陣列第二小的一個數字

思路整理: 這個問題的處理思路有兩個: 1,把陣列排序。排序演算法中效率最高的時間複雜度為O(nlnogn) 2,遍歷陣列,找出最小的兩個數字。時間複雜度為O(n) 下面我們用第二種方法來處理這個問題。 /** * 找出陣列中第二小的一個數字 */ public clas

Three Sum陣列,所有三個數字的組合,其和為給定值的情況

import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Three Sum * * Given an array S of n integ

陣列第k大的數時間複雜度分析、C++程式碼實現. TopK in array. ( leetcode

找出陣列中第k大的數. TopK in array. ( leetcode - 215 ) 最近面試過程中遇到的一個題目,也是大資料時代常見的題目,就來總結一下。 面試題目: 1、10億數中,找出最大的100個數。用你能想到的最優的時間和空間效率。 2

bfprt演算法----陣列最小的k個數Java

 無序陣列中最小的k個數 對於一個無序陣列,陣列中元素為互不相同的整數,請返回其中最小的k個數。 給定一個整數陣列A及它的大小n,同時給定k,請返回其中最小的k個數。 測試樣例: [1,2,4,3],4,2 返回:[1,2] (1)利用堆,時間複雜度O(Nlog

python給定一個整數陣列和一個目標值,陣列中和為目標值的兩個數--演算法

1、使用最容易理解的遍歷陣列進行查詢 def solution(nums,target): #如果列表長度小於2,則直接結束 if len(nums) < 2: return #兩次迴圈列表,分別對列表中的所有可

尋找一個字串的最長重複子串字尾陣列&一個字串最長不重複子串

一、尋找一個字串中的最長重複子串(字尾陣列) 字尾陣列其實可以看尋找一個字串中的最長重複子串(字尾陣列)作一個由字串s倒數i個字元組成的子串的集合,其中0<i<s.length(),例如 字串strstr的字尾陣列為: {r,tr,str,rstr,trstr,

陣列第K個最小的數快速排序

問題描述:給定一個無序的陣列,從一個數組中找出第K個最小的數,例如,對於給定陣列序列{1,5,2,6,8,0,6},其中第4小的數為5。 演算法思路:採用快速排序,分而治之的思想,根據主元,每次Partiton以主元為軸,比它小的數在左邊,比它大的數在右邊,判