[剑指-50](php&python):数组中出现重复的数字

说明:记录刷剑指offer,使用php与python两种语言,对解题思路以及涉及到的基本语法以及知识点做学习记录。其中对于每道题目进行粗略的分类。
题目来源
题目描述

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

解题思路(参考剑指offer 第二版)
  • 方法一:暴力直接的结果方法,双循环,计数统计次数,此中方法时间复杂度为 O(n^2)
  • 方法二:把输入的数组排序,之后从头到尾扫描排序后的数组即可,排序一个长度为n的数组需要O(nlogn)的时间
  • 方法三:哈希表解决,从头到尾顺序扫描数组的每个数字,每扫到一个数字的时候,可以使用O(1)的时间判断哈希表是否存在该数字,没有加入哈希表,存在即找到了一个重复的数字。算法复杂度为O(n),但提高时间效率是以空间为代价的。
  • 方法四:利用数组数字的特性,因为所有的数字都在0到n-1之间,如果数组中没有重复的元素,则数组排序后,第i个位置值即为i。由于数组中有重复的数字,所以有些位置与此位置的值存在不匹配的现象。
    具体思路:重新排这个数组,从头到尾扫描这个数组中的每个数字,当扫描到下标尾i的数字时,首先比较这个数字(用m表示)是否等于i。如果i == m,则直接扫描下一个数字;如果i != m, 则需要拿此位置的数m与数组的第m个数字比较。如果此数字与第m个数字相等则找到了第一个重复的数字(此数字在i和m位置都出现了);如果不想等,就把第i个位置的数m与第m个位置的数字交换,把m放在应该放的位置上,之后重复比较、交换的过程,直至发现一个重复的数字。
    例如:{2,3,1,0,2,5,3} ,数组名为nums
    i = 0 时 nums[i] = 2 , nums[i] != i 交换数字 nums[i] nums[nums[i]]即交换nums[0] 与 nums[2] ,结果为[1,3,2,0,2,5,3];
    此时第0个数字是1,仍与下标本相等,继续把它和下标为1的数字交换,结果为[3,1,2,0,2,5,3];
    第0个数字是3,仍与下标本相等,继续把它和下标为3的数字交换,结果为[0,1,2,3,2,5,3];
    此时第0个位置数与此下标相等,接下来的数字中,下标1,2,3的3个数都与下标相等,所以不需要执行任何操作,接下来扫描下标为4的数字2,由于下标与其数值不想等,需要和下标为2的数字比较,此时数组中下标为2的数字也是2,因此找到一个重复的数字。
编程实现
PHP
<?php
    运行时间:30ms

    占用内存:2504k
    function duplicate($numbers, &$duplication)
    {
        
        //这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
        //函数返回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
        
#   运行时间:29ms
#
#   占用内存: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])  
知识点总结
  1. php引用传递参数
    调用一个函数,只能有一个返回值,(除非你返回的是一个数组,数组里就可以包含多个值,但严格来说,这也是只能返回一个值,一个数组)。
    但你调用函数,需要返回二个值时,使用引用传递就间接达到这个目的。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容

  • 找出数组中重复的数字 在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几...
    Longshihua阅读 598评论 0 3
  • <center>#1 Two Sum</center> link Description:Given an arr...
    铛铛铛clark阅读 2,151评论 0 3
  • 一、快捷键 ctr+b 执行ctr+/ 单行注释ctr+c ...
    o_8319阅读 5,814评论 2 16
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,341评论 0 2
  • 朋友,有以诚心交者,有以酒肉交者,有以利益交者;有为你两肋插刀者,有陷你于不义者,亦有背叛你者。交友之道,斯难矣。...
    格己致明阅读 407评论 9 19