ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 获取最长公共前缀 ~~~  /**   * Notes: 最长公共前缀   * @Interface longestCommonPrefix   * @param $strs   * @return false|mixed|string   * @author: Administrator - virus   * @Time: 2021/4/20 17:05   */  function longestCommonPrefix($strs)  {      if (count($strs) == 0) {          return "";     }      if (count($strs) == 1) {          return $strs[0];     }      $ans = $strs[0];      for ($i = 1; $i < count($strs); $i++) {          for ($j = 0; $j < strlen($ans), $j < strlen($strs[$i]); $j++) {              if ($ans[$j] != $strs[$i][$j]) {                  break;             }         }          $ans = substr($ans, 0, $j);          if ($ans == "")              return $ans;     }      return $ans;  } ~~~ ### 输出一个数的所有加法的排列组合 1. 输出所有组合 ~~~  /*   * 4   * 1+1+1+1   * 2+2   * 1+3   * 3+1   * */  function climbStairs($n, $i = 1)  {      if ($i > $n / 2) {     } else {          $b = $n - $i;          echo "{$n} = {$i} + {$b} \n";          climbStairs($n, $i + 1);     }  } ~~~ 2. 获取所有组合 ~~~  function change($n, $i = 1)  {      $arr = [];      while ($i <= $n / 2) {          $b = $n - $i;          $a = [$i, $b];          array_push($arr, $a);          $i++;     }      return $arr;  } ~~~ ### 统计数组中只出现一次的数字 ~~~  /**   * Notes: 只出现一次的数字   * Function: singleNumber   * @param $nums   * @return int|string   * @author: Administrator - virus   * Time: 2021/4/30 14:10   */  function singleNumber($nums)  {      $nums = array_count_values($nums);      foreach ($nums as $k => $v) {          if ($v == 1) {              return $k;         }     }  } ~~~ ### 整数反转 ~~~  /**   * Notes: 整数反转   * Function: reverse   * @param $x   * @return float|int   * @author: Administrator - virus   * Time: 2021/5/7 10:09   */  function reverse($x)  {      if ($x < 0) {          return -$this->reverse(-$x);     } elseif ($x === 0) {          return 0;     } else {          $reversed = 0;          while ($x !== 0) {              $reversed = $reversed * 10 + $x % 10;              $x = (int)($x / 10);         }          return $reversed < 0 || $reversed >= 2 ** 31 ? 0 : $reversed;     }  } ~~~ ### 计算两个数组的交集,且不重复 ~~~  /**   * Notes: 计算两个数组的交集,且不重复   * Function: intersection   * @param $nums1   * @param $nums2   * @return array   * @author: Administrator - virus   * Time: 2021/5/10 13:41   */  function intersection($nums1, $nums2)  {      $tmp = [];      foreach ($nums1 as $k1 => $v1) {          if (in_array($v1, $nums2)) {              if (!in_array($v1, $tmp)) {                  array_push($tmp, $v1);             }         }     }      return $tmp;  } ~~~ 升级版 ~~~  /**   * Notes: 计算两个数组的交接,升级内容   * Function: intersection_ii   * @param $nums1   * @param $nums2   * @return array   * @author: Administrator - virus   * Time: 2021/5/10 15:37   */  function intersection_ii($nums1, $nums2)  {      $arr = [];      for ($i = 0; $i < count($nums1); $i++) {          $index = array_search($nums1[$i], $nums2);          //当元素在nums2中存在是,将该元素插入arr并在nums2中将该元素删除          if ($index > -1) {              array_push($arr, $nums1[$i]);              // 在nums2中将该元素删除              array_splice($nums2, $index, 1);         }     }      return $arr;  } ~~~ ### 返回数组元素的第三大的数,相同的值算一个 ~~~  /**   * Notes: 返回数组元素的第三大的数,相同的值算一个   * Function: thirdMax   * @param $nums   * @return mixed   * @author: Administrator - virus   * Time: 2021/5/11 9:19   */  function thirdMax($nums)  {      $len = count($nums);      if ($len < 3) {          return max($nums);     }      asort($nums);      $nums = array_values(array_unique($nums));      if (count($nums) < 3) {          return max($nums);     }      $result_index = count($nums) - 3;      return $nums[$result_index];  } ~~~ ### 二分查找元素 ~~~  /**   * Notes: 二分查找元素   * Function: twoSearch   * @param $nums   * @param $target   * @return int   * @author: Administrator - virus   * Time: 2021/6/1 8:38   */  function twoSearch($nums, $target)  {      $len = count($nums);      $low = 0;      $high = $len - 1;      while ($low <= $high) {          $mid = intval(($low + $high) / 2);          if ($nums[$mid] > $target) {              // 查找的目标比参照点小,舍去右边的              $high = $mid - 1;         } elseif ($nums[$mid] < $target) {              // 查找的目标比参照点大,舍去左边的              $low = $mid + 1;         } else {              // 查找目标与参照点相等              return $mid;         }     }      // 未找到,返回-1      return -1;  } ~~~ 案例:在目标数组里找出和为目标的2个数的索引下标 + 1显示 ~~~  /**   * Notes: 在目标数组里找出和为目标的2个数的索引下标 + 1显示   * 利用二分查找   * Function: twoSum   * @param $numbers   * @param $target   * @return array|int[]   * @author: Administrator - virus   * Time: 2021/6/1 9:08   */  function twoSum($numbers, $target)  {      if (!is_array($numbers)) {          return [-1, -1];     }      if (empty($target)) {          return [-1, -1];     }      $len = count($numbers);      for ($i = 0; $i < $len; $i++) {          $low = $i + 1;          $high = $len - 1;          while ($low <= $high) {              $mid = intval(($low + $high) / 2);              if ($numbers[$mid] > $target - $numbers[$i]) {                  $high = $mid - 1;             } elseif ($numbers[$mid] < $target - $numbers[$i]) {                  $low = $mid + 1;             } else {                  return [$i + 1, $mid + 1];             }         }     }      return [-1, -1];  }  ​ ~~~ ~~~  /**   * Notes: 二分查找,折半查找 递归   * Function: guess   * @param $randNum   * @param $minNum   * @param $maxNum   * @param int $guessNum   * @return mixed   * @author: Administrator - 仙工   * Time: 2021/6/8 11:31   */  function guess($randNum, $minNum, $maxNum, $guessNum = 1)  {      //二分查找,除以2      $num = intval(($maxNum - $minNum) / 2);      //中间值不能直接比较,需要再加上最小值,例如50-100,(100-50)/2等于25,中间值是50+25等于75      $guessValue = $num + $minNum;      echo "猜测第{$guessNum}次:{$guessValue}\n";      if ($guessValue == $randNum) {          return $randNum;     } elseif ($guessValue > $randNum) {          // 猜测值大于实际值          return guess($randNum, $minNum, $guessValue, $guessNum + 1);     } elseif ($guessValue < $randNum) {          // 猜测值小于实际值          return guess($randNum, $guessValue, $maxNum, $guessNum + 1);     }  } ~~~ ### 判断一个字符串里的所有字符是否唯一 ~~~  /**   * Note: 判断一个字符串里的的所有字符是否唯一   * @param String $astr   * @return bool   */  function isUnique($astr)  {      $temp = [];      $len = strlen($astr);      for ($i = 0; $i < $len; $i++) {          if (isset($temp[$astr[$i]])) {              return false;         } else {              $temp[$astr[$i]] = true;         }     }      return true;  } ~~~ ### 判断两个字符串的字符是否一致 ~~~  /**   * 字符串 s1 和 s2 的字母是否一致   * @param String $s1   * @param String $s2   * @return Boolean   */  function CheckPermutation($s1, $s2)  {      // 长度都不一致,肯定是返回false      if (strlen($s1) != strlen($s2)) {          return false;     }      // 从2和字符串里提取出元素组合成数组,然后进行排序,排完序在形成字符串判断两者是否相等      $temp1 = [];      $temp2 = [];      for ($i = 0; $i < strlen($s1); $i++) {          $temp1[] = $s1[$i];     }      for ($i = 0; $i < strlen($s2); $i++) {          $temp2[] = $s2[$i];     }      sort($temp1);      sort($temp2);  ​      $s1 = implode("", $temp1);      $s2 = implode("", $temp2);  ​      return $s1 == $s2;  } ~~~ ### 找出数组中数字出现次数超过数组长度一般的数字 ~~~  /**   * Note:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。没有返回null   * @param Integer[] $nums   * @return Integer   */  function majorityElement($nums)  {      // 数组的长度的一半      $half_len = count($nums) / 2;      $new_arr = array_count_values($nums);      foreach ($new_arr as $k => $v) {          if ($v > $half_len) {              return $k;         }     }  } ~~~ ### 将字符串元素分割成一个字符串数组 ~~~  /**   * Notes: 将字符串元素分割成一个字符串数组   * Function: mb_str_split   * @param $str   * @return array|false|string[]   * @author: Administrator - virus   * Time: 2021/6/8 10:45   */  function mb_str_split($str)  {      return preg_split('/(?<!^)(?!$)/u', $str);  } ~~~ ### 找出0~n里不是顺序的数 ~~~  /**   * 从0~n里面顺序的数里没有的那一个   * @param Integer[] $nums   * @return Integer   */  function missingNumber($nums)  {      $n = count($nums);      return (0 + $n) * ($n + 1) / 2 - array_sum($nums);  } ~~~ ### 不使用+号和其他算术运算符完成加法功能 ~~~  /**   * 不使用+号和其他算术运算符   * @param Integer $a   * @param Integer $b   * @return Integer   */  function add($a, $b)  {      while ($b != 0) {          // 二进制异或          $temp = $a ^ $b; // $temp = 1011          var_dump($temp);          $b = ($a & $b) << 1; // 1010 001 0000 << 1 0          var_dump($b);// $b = 0          $a = $temp; // 1011 => 11     }      return $a;  } ~~~ ### 计算一个数的阶乘有多少个0 ~~~  /**   * 计算一个数的阶乘尾数有多少个0   * @param Integer $n   * @return Integer   */  function trailingZeroes($n)  {      $count = 0;      while ($n > 0) {          // 计算这个数能除以几个5          $count += intval($n / 5); // 5 + 1 + 0          $n = intval($n / 5); // 5 => 1 => 0     }      return $count;  } ~~~ ### 斐波那契数列 ~~~  // 优化  function fab($n)  {      $first = 0;      $second = 1;      $next_value = 0;      for ($i = 2; $i <= $n; $i++) {          $next_value = $first + $second;          $first = $second;          $second = $next_value;     }      return $next_value;  }  ​  function fab1($n)  {      if ($n <= 0) {          return 0;     }      if ($n == 0 || $n == 1) {          return $n;     }      return fab1($n - 1) + fab1($n - 2);  } ~~~ ### 替换手机号码为\* ~~~  /**   * Notes: 替换手机号码某几位为****   * Function: phoneEllipsis   * @param $phone   * @param int $start   * @param int $end   * @return string|string[]   * @author: Administrator - virus   * Time: 2021/7/12 11:55   */  function phoneEllipsis($phone, $start = 3, $end = 4)  {      if ((strlen($phone) - $start) < 4) {          return substr_replace($phone, '****', 3, 4);     }      return substr_replace($phone, '****', $start, $end);  }  ​ ~~~ ### 验证手机号码 ~~~  /**       * Notes: 正则表达式验证手机号码       * Author: Administrator - virus       * DateTime: 2021/1/25 13:12       * @param $phone       * @return bool       */  function check_phone($phone)  {      if (!preg_match("/^1[345789]\d{9}$/", $phone)) {          return false;     } else {          return true;     }  } ~~~ ### 文本过长,截取部分显示省略号 ~~~  function cutSubstr($str, $len = 10)  {      if (strlen($str) > $len) {          $str = mb_substr($str, 0, $len, 'utf-8') . '...';     }      return $str;  } ~~~