字符串中找出连续最长数字串(PHP版本)

题目描述一:读入一个字符串str,输出字符串str中的连续最长的数字串。如果有多个连续最长的数字串,只需输出第一个即可。

  • 输入描述

输入包含1个测试用例,一个字符串str,长度不超过255。

  • 输出描述

在一行内输出str中里连续最长的数字串。

  • 示例

输入为:
abcd12345ed125ss123456789

输出为:
数字串为123456789,长度为9

  • 思路分析:将字符串中数字串分离出来,并且计算出哪个数字串的长度最长。我们要做的工作就是:将每一段的数字串保存在一个临时字符串中,如果“当前临时字符串的长度”大于“最大数字字符串长度”,就将“最大数字字符串长度”替换为“当前临时字符串的长度”,并清空当前临时字符串的长度,开始下一轮比较。
  • 实现代码如下
<?php
function getLongNum($srcStr) {
    $arrRes = [
        'str' => '',
        'length' => 0
    ];
    // 若为空,直接返回
    if (empty($srcStr)) {
        return $arrRes;
    }

    // 若为纯数字,直接计算
    $length = strlen($srcStr);
    if (is_numeric($srcStr) && (strpos($srcStr, '.') === false)) {
        $arrRes = [
            'str' => $srcStr,
            'length' => $length,
        ];

       return $arrRes;
    }

    // 非纯数字,需要计算
    $tmp = '';
    $maxLength = 0;
    $maxStr = '';
    for($i=0; $i<$length; $i++) {
        if($srcStr[$i]>='0' && $srcStr[$i]<='9') {
            while (($i < $length) && ($srcStr[$i]>='0') && ($srcStr[$i]<='9')) {
                $tmp .= $srcStr[$i++];
            }
            $tmpLength = strlen($tmp);
            if ($tmpLength > $maxLength) {
                $maxLength = $tmpLength;
                $maxStr = $tmp;
            }
        }
        $tmp = '';
    }

    $arrRes = [
        'str' => $maxStr,
        'length' => $maxLength,
    ];

    return $arrRes;
}

$srcStr = '';
$arrRes = getLongNum($srcStr);
var_dump($arrRes);
print_r(nl2br("\n"));

$srcStr = '123456';
$arrRes = getLongNum($srcStr);
var_dump($arrRes);
print_r(nl2br("\n"));

$srcStr = '123456789.9876';
$arrRes = getLongNum($srcStr);
var_dump($arrRes);
print_r(nl2br("\n"));

$srcStr = 'abc12345ss789';
$arrRes = getLongNum($srcStr);
var_dump($arrRes);
print_r(nl2br("\n"));

$srcStr = 'aaaaaabbbb123';
$arrRes = getLongNum($srcStr);
var_dump($arrRes);
print_r(nl2br("\n"));

运行结果如下所示:

array(2) { ["str"]=> string(0) "" ["length"]=> int(0) }
array(2) { ["str"]=> string(6) "123456" ["length"]=> int(6) }
array(2) { ["str"]=> string(9) "123456789" ["length"]=> int(9) }
array(2) { ["str"]=> string(5) "12345" ["length"]=> int(5) }
array(2) { ["str"]=> string(3) "123" ["length"]=> int(3) }

从结果来看,符合预期。

题目描述二:读入一个字符串str,输出字符串str中的连续最长的数字串。如果有多个连续最长的数字串,则全部输出。

  • 输入描述

输入包含1个测试用例,一个字符串str,长度不超过255。

  • 输出描述

在一行内输出str中里连续最长的数字串。

  • 示例

输入为:
abcd987654321ed125ss123456789

输出为:
数字串为123456789、987654321,长度为9

  • 实现代码如下
<?php
function getLongNumAll($srcStr) {
    $arrRes = [
        'str' => [],
        'length' => 0
    ];
    // 若为空,直接返回
    if (empty($srcStr)) {
        return $arrRes;
    }

    // 若为纯数字,直接计算
    $length = strlen($srcStr);
    if (is_numeric($srcStr) && (strpos($srcStr, '.') === false)) {
        $arrRes = [
            'str' => [$srcStr],
            'length' => $length,
        ];
        return $arrRes;
    }

    // 非纯数字,需要计算
    $tmp = '';
    $maxLength = 0;
    for($i=0; $i<$length; $i++) {
        if($srcStr[$i]>='0' && $srcStr[$i]<='9') {
            while (($i < $length) && ($srcStr[$i]>='0') && ($srcStr[$i]<='9')) {
                $tmp .= $srcStr[$i++];
            }
            $tmpLength = strlen($tmp);
            if ($tmpLength > $maxLength) {
                $maxLength = $tmpLength;
                $arrRes['str'] = [$tmp];
                $arrRes['length'] = $tmpLength;
            } elseif ($tmpLength == $maxLength) {
                $arrRes['str'][] = $tmp;
            }
        }
        $tmp = '';
    }

    return $arrRes;
}

$srcStr = '123456789.987654321';
$arrRes = getLongNumAll($srcStr);
var_dump($arrRes);
print_r(nl2br("\n"));

$srcStr = 'abc12345ss7897654';
$arrRes = getLongNumAll($srcStr);
var_dump($arrRes);
print_r(nl2br("\n"));

$srcStr = 'aaaaaabbbbbbb';
$arrRes = getLongNumAll($srcStr);
var_dump($arrRes);
print_r(nl2br("\n"));
?>

运行结果如下所示:

array(2) { ["str"]=> array(2) { [0]=> string(9) "123456789" [1]=> string(9) "987654321" } ["length"]=> int(9) }
array(2) { ["str"]=> array(1) { [0]=> string(7) "7897654" } ["length"]=> int(7) }
array(2) { ["str"]=> array(0) { } ["length"]=> int(0) }

从结果来看,符合预期。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值