[劍指-50](php&python):數(shù)組中出現(xiàn)重復(fù)的數(shù)字

說(shuō)明:記錄刷劍指offer,使用php與python兩種語(yǔ)言,對(duì)解題思路以及涉及到的基本語(yǔ)法以及知識(shí)點(diǎn)做學(xué)習(xí)記錄。其中對(duì)于每道題目進(jìn)行粗略的分類。
題目來(lái)源
題目描述

在一個(gè)長(zhǎng)度為n的數(shù)組里的所有數(shù)字都在0到n-1的范圍內(nèi)爱致。 數(shù)組中某些數(shù)字是重復(fù)的,但不知道有幾個(gè)數(shù)字是重復(fù)的寒随。也不知道每個(gè)數(shù)字重復(fù)幾次糠悯。請(qǐng)找出數(shù)組中任意一個(gè)重復(fù)的數(shù)字。 例如妻往,如果輸入長(zhǎng)度為7的數(shù)組{2,3,1,0,2,5,3}互艾,那么對(duì)應(yīng)的輸出是第一個(gè)重復(fù)的數(shù)字2。

解題思路(參考劍指offer 第二版)
  • 方法一:暴力直接的結(jié)果方法讯泣,雙循環(huán)纫普,計(jì)數(shù)統(tǒng)計(jì)次數(shù),此中方法時(shí)間復(fù)雜度為 O(n^2)
  • 方法二:把輸入的數(shù)組排序,之后從頭到尾掃描排序后的數(shù)組即可昨稼,排序一個(gè)長(zhǎng)度為n的數(shù)組需要O(nlogn)的時(shí)間
  • 方法三:哈希表解決节视,從頭到尾順序掃描數(shù)組的每個(gè)數(shù)字,每掃到一個(gè)數(shù)字的時(shí)候假栓,可以使用O(1)的時(shí)間判斷哈希表是否存在該數(shù)字寻行,沒(méi)有加入哈希表,存在即找到了一個(gè)重復(fù)的數(shù)字匾荆。算法復(fù)雜度為O(n),但提高時(shí)間效率是以空間為代價(jià)的拌蜘。
  • 方法四:利用數(shù)組數(shù)字的特性,因?yàn)樗械臄?shù)字都在0到n-1之間牙丽,如果數(shù)組中沒(méi)有重復(fù)的元素简卧,則數(shù)組排序后,第i個(gè)位置值即為i烤芦。由于數(shù)組中有重復(fù)的數(shù)字举娩,所以有些位置與此位置的值存在不匹配的現(xiàn)象。
    具體思路:重新排這個(gè)數(shù)組拍棕,從頭到尾掃描這個(gè)數(shù)組中的每個(gè)數(shù)字晓铆,當(dāng)掃描到下標(biāo)尾i的數(shù)字時(shí)勺良,首先比較這個(gè)數(shù)字(用m表示)是否等于i绰播。如果i == m,則直接掃描下一個(gè)數(shù)字尚困;如果i != m, 則需要拿此位置的數(shù)m與數(shù)組的第m個(gè)數(shù)字比較蠢箩。如果此數(shù)字與第m個(gè)數(shù)字相等則找到了第一個(gè)重復(fù)的數(shù)字(此數(shù)字在i和m位置都出現(xiàn)了);如果不想等事甜,就把第i個(gè)位置的數(shù)m與第m個(gè)位置的數(shù)字交換谬泌,把m放在應(yīng)該放的位置上,之后重復(fù)比較逻谦、交換的過(guò)程掌实,直至發(fā)現(xiàn)一個(gè)重復(fù)的數(shù)字。
    例如:{2,3,1,0,2,5,3} 邦马,數(shù)組名為nums
    i = 0 時(shí) nums[i] = 2 贱鼻, nums[i] != i 交換數(shù)字 nums[i] nums[nums[i]]即交換nums[0] 與 nums[2] ,結(jié)果為[1,3,2,0,2,5,3];
    此時(shí)第0個(gè)數(shù)字是1,仍與下標(biāo)本相等滋将,繼續(xù)把它和下標(biāo)為1的數(shù)字交換邻悬,結(jié)果為[3,1,2,0,2,5,3];
    第0個(gè)數(shù)字是3,仍與下標(biāo)本相等随闽,繼續(xù)把它和下標(biāo)為3的數(shù)字交換父丰,結(jié)果為[0,1,2,3,2,5,3];
    此時(shí)第0個(gè)位置數(shù)與此下標(biāo)相等,接下來(lái)的數(shù)字中掘宪,下標(biāo)1蛾扇,2攘烛,3的3個(gè)數(shù)都與下標(biāo)相等,所以不需要執(zhí)行任何操作镀首,接下來(lái)掃描下標(biāo)為4的數(shù)字2医寿,由于下標(biāo)與其數(shù)值不想等,需要和下標(biāo)為2的數(shù)字比較蘑斧,此時(shí)數(shù)組中下標(biāo)為2的數(shù)字也是2靖秩,因此找到一個(gè)重復(fù)的數(shù)字。
編程實(shí)現(xiàn)
PHP
<?php
    運(yùn)行時(shí)間:30ms

    占用內(nèi)存:2504k
    function duplicate($numbers, &$duplication)
    {
        
        //這里要特別注意~找到任意重復(fù)的一個(gè)值并賦值到duplication[0]
        //函數(shù)返回True/False
        $length = count($numbers);
        if (empty($numbers) || $length <= 0):
            return false;
        
        foreach ($numbers as $item) {
            if ($item < 0 || $item > $length - 1) {
                return false;
            }
        }
        
        for ($i = 0; $i < $length; $i++ ) {
            while ($i != $numbers[$i]) {
                
                if($numbers[$i] == $numbers[$numbers[$i]]){
                    $duplication[0] = $numbers[$i];
                    return true;
                }
                
                $temp = $numbers[$i];
                $numbers[$i] = $numbers[$temp];
                $numbers[$temp] = $temp;
            }
        }
        
    }
?>
Python
# -*- coding:utf-8 -*-
class Solution:
    def duplicate(self, numbers, duplication):
        # write code here
        if not numbers or len(numbers) <= 0:
            return False
    
        for num in numbers:
            count = 0
            for item in numbers:
                
                if num == item:
                    count += 1
                if count > 1:
                    duplication[0] = item
                    return duplication[0]
                    break
        return False
        
#   運(yùn)行時(shí)間:29ms
#
#   占用內(nèi)存:5736k
    def duplications(self, nums, dups):
        if not nums or len(dups) <= 0:
            return False
        for i in range(len(nums)):
                if (nums[i] < 0 ) or (nums[i] > len(nums) - 1):
                return False
        for i in range(len(nums)):
            
            while i != nums[i]:
                if nums[i] == nums[nums[i]]:
                    dups[0] = nums[i]
                    return True
        
                temp = nums[i]
                nums[i] = nums[temp]
                nums[temp] = temp
            
        return False
            
            
s = Solution()
print s.duplicate([2,1,3,0,4], [0])
print s.duplications([2,3,1,0,2,5,3], [0])  
知識(shí)點(diǎn)總結(jié)
  1. php引用傳遞參數(shù)
    調(diào)用一個(gè)函數(shù)竖瘾,只能有一個(gè)返回值沟突,(除非你返回的是一個(gè)數(shù)組,數(shù)組里就可以包含多個(gè)值捕传,但嚴(yán)格來(lái)說(shuō)惠拭,這也是只能返回一個(gè)值,一個(gè)數(shù)組)庸论。
    但你調(diào)用函數(shù)职辅,需要返回二個(gè)值時(shí),使用引用傳遞就間接達(dá)到這個(gè)目的聂示。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末域携,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鱼喉,更是在濱河造成了極大的恐慌秀鞭,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扛禽,死亡現(xiàn)場(chǎng)離奇詭異锋边,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)编曼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門豆巨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人掐场,你說(shuō)我怎么就攤上這事往扔。” “怎么了刻肄?”我有些...
    開(kāi)封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵瓤球,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我敏弃,道長(zhǎng)卦羡,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮绿饵,結(jié)果婚禮上欠肾,老公的妹妹穿的比我還像新娘。我一直安慰自己拟赊,他們只是感情好刺桃,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著吸祟,像睡著了一般瑟慈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屋匕,一...
    開(kāi)封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天葛碧,我揣著相機(jī)與錄音,去河邊找鬼过吻。 笑死进泼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纤虽。 我是一名探鬼主播乳绕,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逼纸!你這毒婦竟也來(lái)了洋措?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤樊展,失蹤者是張志新(化名)和其女友劉穎呻纹,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體专缠,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年淑仆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涝婉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔗怠,死狀恐怖墩弯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寞射,我是刑警寧澤渔工,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站桥温,受9級(jí)特大地震影響引矩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一旺韭、第九天 我趴在偏房一處隱蔽的房頂上張望氛谜。 院中可真熱鬧,春花似錦区端、人聲如沸值漫。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)杨何。三九已至,卻和暖如春沥邻,著一層夾襖步出監(jiān)牢的瞬間晚吞,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工谋国, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留槽地,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓芦瘾,卻偏偏與公主長(zhǎng)得像捌蚊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子近弟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 找出數(shù)組中重復(fù)的數(shù)字 在一個(gè)長(zhǎng)度為n的數(shù)組里的所有數(shù)字都在0~n-1的范圍內(nèi)缅糟。數(shù)組中某些數(shù)字是重復(fù)的,但不知道有幾...
    Longshihua閱讀 599評(píng)論 0 3
  • <center>#1 Two Sum</center> link Description:Given an arr...
    鐺鐺鐺clark閱讀 2,164評(píng)論 0 3
  • 一祷愉、快捷鍵 ctr+b 執(zhí)行ctr+/ 單行注釋ctr+c ...
    o_8319閱讀 5,828評(píng)論 2 16
  • 在C語(yǔ)言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來(lái)閱讀 3,352評(píng)論 0 2
  • 朋友窗宦,有以誠(chéng)心交者,有以酒肉交者二鳄,有以利益交者赴涵;有為你兩肋插刀者,有陷你于不義者订讼,亦有背叛你者髓窜。交友之道,斯難矣欺殿。...
    格己致明閱讀 416評(píng)論 9 19