24、PHP 实现第一个只出现一次的字符、数组中的逆序对

题目: PHP 实现第一个只出现一次的字符

描述:
在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置

<?php

function FirstNotRepeatingChar($str)
{
    $charArr = count_chars($str,1);
    $index = 10000;
    foreach($charArr as $k=>$v){
        if($v == 1){
            strpos($str, chr($k))<$index?$index = strpos($str, chr($k)):'';
        }
    }
    if($index == 10000)
        return -1;
    return $index;
}

题目: PHP 实现数组中的逆序对

描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。
输入一个数组,求出这个数组中的逆序对的总数P。
并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
示例1
输入

1,2,3,4,5,6,7,0
输出

7

<?php

function InversePairs($data)
{
    return mergeSort($data) % 1000000007;
}
  
function mergeSort(&$arr) {
    $len = count($arr);
    $sum = 0;
    mSort($arr, 0, $len-1, $sum);
    return $sum;
}
  
function mSort(&$arr, $left, $right, &$sum) {
    if($left < $right) {
        $center = ($left+$right) >> 1;
        mSort($arr, $left, $center, $sum);
        mSort($arr, $center+1, $right, $sum);
        mergeArray($arr, $left, $center, $right, $sum);
    }
}
   
function mergeArray(&$arr, $l, $m, $r, &$sum) {
    $i = $l;
    $j = $m+1;
    while($i<=$m && $j<=$r) {
        if($arr[$i] <= $arr[$j]) {
            $temp[] = $arr[$i++];
        } else {
            $sum += $m - $i + 1;
            $temp[] = $arr[$j++];
        }
    }
    while($i <= $m) {
        $temp[] = $arr[$i++];
    }
    while($j <= $r) {
        $temp[] = $arr[$j++];
    }
    for($i=0, $len=count($temp); $i<$len; $i++) {
        $arr[$l+$i] = $temp[$i];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值