剑指offer(PHP版改写)----数组部分

题目一:

  在一个长度为n的数组里的所有数字都在0~n-1的范围内。找出数组中任意一个重读数字。

/** * 找出数组中的重复数字 * 长度为n的数组 所有数字在0~n-1的范围内 * * * @param $num   数组 * @param $length  数组长度 * @return bool */    function getNum($num,$length){        $mark = array();        if (count($num)==0||$length<=0){            return false;        }        for ($i=0;$i<$length;++$i){            if ($num[$i]<0||$num[$i]>$length-1){                return false;            }        }        for ($i=0;$i<$length;++$i){            while ($num[$i]!=$i){                if ($num[$i]==$num[$num[$i]]){                    $mark[] = $num[$i];                    break;                }                $temp = $num[$i];                $num[$i]=$num[$temp];                $num[$temp]=$temp;            }        }       return $mark;    }

    $a = [3,2,4,6,5,2,3,6];    print_r(getNum($a,count($a)));题目二:不修改数组找出重复数字在一个长度为n+1的数组里所有数字都在1~n的范围内,所以必有重复数字。找出任意一个重复数字,但不能修改数组。
/** * 不改变数组 找出任意一个重复数字 * 二分法 * 时间换空间 * @param $number  数组 * @param $length  数组长度 */    function getDuplication($number,$length){

        if (count($number)==0||$length<=0){            return false;        }

        $start = 1;        $end = $length-1;

        while($end>=$start){            $middle = (($end-$start)>>1)+$start;   //位运算 求中值            $count  =countRange($number,$length,$start,$middle) ;            if ($end==$start){                if ($count>1){                    return $start;                }else{                    break;                }            }

            if ($count>($middle-$start+1)){                $end = $middle;            }else{                $start = $middle+1;            }

        }

//        return -1;    }

    function countRange($num,$length,$start,$end){        if (count($num)==0){            return 0;        }

        $count = 0;        for ($i = 0;$i<$length;$i++){            if ($num[$i]>=$start&&$num[$i]<=$end){                ++$count;            }        }        return $count;    }

    $a = [3,2,4,6,5,2,3,6];    print_r(getDuplication($a,count($a)));

原文地址:https://www.cnblogs.com/cyworz/p/11212412.html

时间: 2024-10-09 03:47:30

剑指offer(PHP版改写)----数组部分的相关文章

剑指offer(PHP版改写)---两个栈实现队列

$arr1 = array();$arr2 = array(); function push($node){ global $arr1; array_push($arr1,$node);} function pop(){ global $arr1; global $arr2; if (!empty($arr2)){ return array_pop($arr2); }else{ while (!empty($arr1)){ array_push($arr2,array_pop($arr1));

【剑指offer】Q29:数组中出现次数超过一半的数字

就本题而言,个人觉得练习下partition函数是有必要的,毕竟它是快速排序的核心,是基础性的东西,也是必须要掌握的,至于书中给出的"取巧"性解法,是属于个人思维能力的考察,是一种考虑问题的思路,不是一两个问题就能练就的. partition函数,包括快速排序,是一定要信手拈来的,必须的. import random def MoreThanHalf(array): if len(array) == 0: return 0 start = 0 end = len(array) - 1

【剑指offer】二维数组中的查找

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 分析: 首先选择数组中右上角的数字.如果该数字等于要查找的数字,查找过程结束:如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行.依次类推,直到查找范围为空. 示例程序: #include <stdio.h> #include <stdlib.h> int

剑指OFFER之二维数组中的查找(九度OJ1384)

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数. 输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字. 接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每

【剑指offer】Q40:数组中出现一次的数字

按着书里面讲述的方法,根据某一位来将整个数组拆分成两个部分,取每一部分中出现一次的数.书中的处理略显复杂,这里简化下分类的方法. def once(array): reOR = 0 for x in array: reOR ^= x bit1 = firstBit1(reOR) first = 0 second = 0 for x in array: if x & bit1 != 0: first ^= x else: second ^= x return first, second def f

【剑指offer】Q40:数组中出现一次的数

书里面关于分类的判断有些麻烦,通过某一位为0为1来对数组元素进行分类.假如第3位为1,那么也就是元素x & 8 等于或不等于0,所以没必要非的用第几位去判断. def once(array): reOR = 0 for x in array: reOR ^= x bit1 = firstBit1(reOR) first = 0 second = 0 for x in array: if x & bit1 != 0: first ^= x else: second ^= x return f

一起来刷《剑指Offer》——不修改数组找出重复的数字(思路及Python实现)

数组中重复的数字 在上一篇博客中<剑指Offer>-- 题目一:找出数组中重复的数字(Python多种方法实现)中,其实能发现这类题目的关键就是一边遍历数组一边查满足条件的元素. 然后我们在博客用最复杂的方式学会数组(Python实现动态数组)这篇博客中介绍了数组这一结构的本质,并自己动手实现了一个动态数组. 今天我们介绍一下另一道来自<剑指Offer>的关于数组的面试题--不修改数组找出重复的数字. 不修改数组找出重复的数字 题目二:不修改数组找出重复的数字 给定一个长度为 n+

[剑指Offer]5.二维数组中的查找

题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路 [算法系列之三十三]杨氏矩阵 代码 /*--------------------------------------- * 日期:2015-07-19 * 作者:SJF0115 * 题目: 5.二维数组中的查找 * 网址:http://www.nowcoder.com/books/coding-interviews/a

结合《剑指offer(第二版)》面试题51来谈谈归并排序

一.题目大意 给定一个数组A,对于数组A中的两个数字,如果排在前面的一个数字大于(必须大于,等于不算)后面的数字,则这两个数字组成一个逆序对.要求输出数组A中的逆序对的总数.例如,对于数组{7,5,6,4},一共存在5个逆序对,分别是(7,5).(7,6).(7,4).(5,4).(6,4). 注:根据题意可知,必须根据原数组中元素的相对顺序来统计,给定的数组时怎样,那就按照怎样的顺序. 二.思路分析 方法1:暴力破解.双重循环来判断出所有的逆序对数,时间复杂度为O(N^2),空间复杂度为O(1