PHP实现连续子数组的最大和、整数中1出现的次数

简介: 通过上述方法,可以有效地解决实际开发中遇到的相关问题。希望本文对您有所帮助。

PHP 实现连续子数组的最大和、整数中1出现的次数

在编程面试和实际应用中,处理数组和整数的常见问题之一是求解连续子数组的最大和以及计算整数中1出现的次数。本文将详细介绍如何使用 PHP 实现这两个问题的解决方案。

连续子数组的最大和

连续子数组的最大和问题要求找到一个数组中的连续子数组,使得该子数组的元素和最大。这可以使用著名的 Kadane 算法来实现,时间复杂度为 O(n)。

Kadane 算法

Kadane 算法通过遍历数组并在每个位置记录当前最大和与全局最大和来找到连续子数组的最大和。算法步骤如下:

  1. 初始化两个变量 max_so_farmax_ending_here,分别表示全局最大和和当前最大和。
  2. 遍历数组,对于每个元素,更新 max_ending_here 为当前元素值或当前元素值加上前一位置的 max_ending_here,然后更新 max_so_far
  3. 最终,max_so_far 即为所求结果。

PHP 实现代码

function maxSubArraySum($arr) {
    $max_so_far = PHP_INT_MIN;
    $max_ending_here = 0;

    foreach ($arr as $value) {
        $max_ending_here = max($value, $max_ending_here + $value);
        $max_so_far = max($max_so_far, $max_ending_here);
    }

    return $max_so_far;
}

// 示例
$array = [-2, 1, -3, 4, -1, 2, 1, -5, 4];
echo "连续子数组的最大和是: " . maxSubArraySum($array);
​

分析说明表

步骤 操作 说明
1 初始化 max_so_farmax_ending_here 分别表示全局最大和和当前最大和
2 遍历数组,更新 max_ending_heremax_so_far 更新当前子数组和与全局最大和
3 返回 max_so_far 返回全局最大和

整数中1出现的次数

计算一个整数中1出现的次数问题要求统计从1到n的所有整数中数字1出现的总次数。这可以通过逐位分析的方法来解决。

逐位分析法

逐位分析法通过将每个位上的数字分解来统计1出现的次数。主要步骤如下:

  1. 对每一位,计算当前位、低位和高位的值。
  2. 根据当前位的值,计算当前位上1的出现次数。
  3. 累加所有位上1的出现次数。

PHP 实现代码

function countDigitOne($n) {
    $count = 0;
    $factor = 1;
    $lower_num = 0;
    $current_digit = 0;
    $higher_num = 0;

    while ($n / $factor != 0) {
        $lower_num = $n - ($n / $factor) * $factor;
        $current_digit = ($n / $factor) % 10;
        $higher_num = $n / ($factor * 10);

        if ($current_digit == 0) {
            $count += $higher_num * $factor;
        } elseif ($current_digit == 1) {
            $count += $higher_num * $factor + $lower_num + 1;
        } else {
            $count += ($higher_num + 1) * $factor;
        }

        $factor *= 10;
    }

    return $count;
}

// 示例
$n = 13;
echo "从1到$n的整数中,1出现的次数是: " . countDigitOne($n);
​

分析说明表

步骤 操作 说明
1 初始化计数器和位因子 分别表示1的出现次数和当前位因子
2 逐位计算当前位、低位和高位 分解数字
3 根据当前位的值,计算1的出现次数 累加到总计数器中
4 返回总计数 返回从1到n中1的总次数

总结

本文详细介绍了如何使用 PHP 实现连续子数组的最大和及计算整数中1出现的次数这两个问题。通过使用 Kadane 算法和逐位分析法,我们可以高效地解决这些问题,并在实际应用中提高性能和准确性。以下是本文的思维导图,便于理解和复习:

问题解决思维导图
└── PHP 实现
    ├── 连续子数组的最大和
    │   ├── Kadane 算法
    │   ├── 初始化变量
    │   ├── 遍历数组
    │   └── 更新最大和
    └── 整数中1出现的次数
        ├── 逐位分析法
        ├── 初始化计数器
        ├── 逐位计算
        └── 返回总计数
​

通过上述方法,可以有效地解决实际开发中遇到的相关问题。希望本文对您有所帮助。

目录
相关文章
|
7月前
|
PHP
在数组中,找出给定数字的出现次数,比如[1,2,3,2,2]中2的出现次数是3次(任意编程语言描述)
在数组中,找出给定数字的出现次数,比如[1,2,3,2,2]中2的出现次数是3次(任意编程语言描述)
45 0
PHP 将一个数分成区间的数
PHP 将一个数分成区间的数
101 0
|
机器学习/深度学习 Python
python|求连续奇偶数的倒数和
python|求连续奇偶数的倒数和
205 0
剑指offer_数组---数组中出现次数超过一半的数
剑指offer_数组---数组中出现次数超过一半的数
52 0
剑指offer_数组---数字在排序数组中出现的次数
剑指offer_数组---数字在排序数组中出现的次数
44 0
Leetcode_Python 453 最小移动次数使数组元素相等
分析:此题思路比较简单,n-1个数同时加1,相当于每次有一个数自身减1,所以我们可以用数组其他元素与最小值相减,之和即为最小move次数。
72 0
Leetcode_Python 453 最小移动次数使数组元素相等
AcWing 67. 数字在排序数组中出现的次数
AcWing 67. 数字在排序数组中出现的次数
85 0
AcWing 67. 数字在排序数组中出现的次数
PHP实现数组筛选奇数和偶数的方法
PHP实现数组筛选奇数和偶数的方法
310 0
一个数组中有两种数出现了奇数次,其它数都出现了偶数次,怎么找到并打印这两种数
一个数组中有两种数出现了奇数次,其它数都出现了偶数次,怎么找到并打印这两种数