美文网首页
字典序算法

字典序算法

作者: 彭槐 | 来源:发表于2019-02-13 17:52 被阅读0次

背景

今天群里有人问了一个问题: 取出刚刚好大于自己的换位数(后来才知道这就是"字典序算法"),然后自己思考了一下用php简单实现了一下,没有详细验证,可能有bug.下面直接贴图

实现

代码

/**

* 字典序算法(取出刚刚好大于自己的换位数)

* 要刚刚大于,就需要尽量保持高位数字不动,所以从低位开始遍历

* 当低位的数字大于最近高位的数字,这个高位数就是需要被替换的

* 在已经遍历的低位数字中取出刚刚大于高位数的交换,并且把交换到低位的和剩下的全部低位数升序

* @param $number

* @return string

*/

public function getNumber($number)

{

    $length = strlen($number);

    $array = [];

    for ($i = $length-1; $i > 0; $i--) {

        //将已经遍历的低位数字全部放入一个临时的数组

        array_push($array, $number[$i]);

        //当低位的数字大于高位的数字

        if ($number[$i] > $number[$i-1]) {

            //在低位的所有数字中取出刚好大于高位的数字

            $minNumber = $this->minNumber($array, $number[$i-1]);

            //高低位交换

            array_push($array, $number[$i-1]);//原来的高位数字放入低位临时数组中

            $number[$i-1] = $minNumber;//低位取出的数字换给高位

            //删除低位数组中已经换给高位的数字

            $key = array_search($minNumber, $array);

            unset($array[$key]);

            //升序排列低位数组并还原成字符串

            $array = $this->quickSort(array_values($array));

            $newString = implode('', $array);

            //返回高位数和升序排列后的低位数组成的新的数字

            return substr($number, 0, $i).$newString;

        }

}

    return $number;

}

/**

* 取出刚好大于高位的数字

* @param array $array

* @param $number

* @return mixed

*/

public function minNumber(Array $array, $number)

{

    $temp = [];

    foreach ($array as $value) {

        if ($value > $number) {

            array_push($temp, $value);

        }

}

    return min($temp);

}

/**

* 快速排序法

* @param array $array

* @return array

*/

public function quickSort(Array $array){

    $length = count($array);

    if ($length <= 1) {

        return $array;

    }

    //数组第一个值作为分隔值

    $middle = $array[0];

    $leftArray = []; //小于中间值

    $rightArray = []; //大于中间值

    for($i = 1; $i < $length; $i++) {

        if ($middle > $array[$i]) {

            array_push($leftArray, $array[$i]);

        } else {

            array_push($rightArray, $array[$i]);

        }

}

    //递归分割

    $leftArray = $this->quickSort($leftArray);

    $rightArray = $this->quickSort($rightArray);

    //合并

    return array_merge($leftArray, array($middle), $rightArray);

}

相关文章

  • 字典序算法

    题目:给定一个正整数,实现一个方法来求出离该整数最近的大于自身的“换位数”。 换位数:把一个整数各个数位的数字进行...

  • 字典序算法

    背景 今天群里有人问了一个问题:取出刚刚好大于自己的换位数(后来才知道这就是"字典序算法"),然后自己思考了一下用...

  • 字典序算法笔记

    一、相关概念介绍 字典序字典序就是按照字典中出现的顺序对字符进行排序。 全排列给定多个字符,可以按照任意顺序进行排...

  • bigger is greater

    heckerrank 算法题。 原题地址 此题大意为找到,字典序的下一个最小序列。 input output 通过...

  • 字典序

  • 字典序

    字典序 题目原链接:https://www.nowcoder.com/practice/6c9d8d2e426c4...

  • [HBase] - 理解 HBase Rowkey 字典排序

    我们都知道 HBase 的数据根据 rowkey 字典序排序的,理解这个概念很重要。 先理解名词 - 「字典序」 ...

  • 算法:树

    树的常用算法先序、中序、后序递归算法: 层序递归算法:参考:https://blog.csdn.net/qq_38...

  • Leetcode-Easy 953. Verifying an

    题目描述 给定一组单词和字母顺序,然后判断单词之间是否按字典序顺序排序。 字典序的理解:设想一本英语字典里的单词,...

  • 算法 - 字典

    字典 与集合类似,字典也是一种存储唯一值的数据结构,但它是以键值对的形式来存储 ES6中有字典,名为Map 字典的...

网友评论

      本文标题:字典序算法

      本文链接:https://www.haomeiwen.com/subject/axudeqtx.html