You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断第二个整数数组是否为第一个的旋转版本及所需PHP函数

判断第二个数组是否为第一个数组的旋转版本(PHP实现)

核心思路

旋转数组的本质是将原数组拆分为前后两段后交换拼接,比如原数组[1,2,3,4,5,6,7,8]旋转后得到[6,7,8,1,2,3,4,5],相当于把前5个元素和后3个元素交换位置。基于这个特性,将原数组与自身拼接(如A+A)后,所有可能的旋转结果都会是这个拼接数组的子序列。

必要校验与实现步骤

  1. 基础长度校验:两个数组长度必须完全相同,否则直接判定不是旋转版本。
  2. 元素一致性校验:确保两个数组的元素组成完全一致(避免出现长度相同但元素不同的情况,比如原数组是[1,2,3],对比数组是[1,1,4])。
  3. 子序列匹配:将原数组拼接成A+A的形式,判断对比数组是否是这个拼接数组的子序列。

用到的PHP函数

  • count():获取数组长度,用于第一步的长度校验。
  • array_count_values():统计数组中每个元素的出现次数,对比两个数组的元素组成是否一致。
  • array_merge():将原数组与自身拼接,生成包含所有可能旋转结果的数组。
  • implode():将数组转换为字符串(需添加分隔符避免元素歧义),方便用字符串函数判断子串。
  • strpos():判断对比数组的字符串是否是拼接后数组字符串的子串。

示例代码

function isRotation(array $original, array $candidate): bool {
    // 长度不同直接返回false
    if (count($original) !== count($candidate)) {
        return false;
    }

    // 空数组默认判定为旋转(边界情况)
    if (empty($original)) {
        return true;
    }

    // 校验元素组成是否完全一致
    if (array_count_values($original) !== array_count_values($candidate)) {
        return false;
    }

    // 拼接原数组为自身+自身,转成带分隔符的字符串
    $doubleOriginal = implode(',', array_merge($original, $original));
    $candidateStr = implode(',', $candidate);

    // 判断候选数组字符串是否是拼接字符串的子串
    return strpos($doubleOriginal, $candidateStr) !== false;
}

// 测试示例
$A = [1,2,3,4,5,6,7,8];
$B = [6,7,8,1,2,3,4,5];
var_dump(isRotation($A, $B)); // 输出:bool(true)

// 测试非旋转情况
$C = [1,3,2,4,5,6,7,8];
var_dump(isRotation($A, $C)); // 输出:bool(false)

注意事项

使用implode时必须添加分隔符(如逗号),避免因元素位数问题导致误判。例如原数组是[12, 3],对比数组是[1, 23],如果不加分隔符,拼接后的字符串是123123,对比数组的字符串是123,会错误判定为旋转版本。

内容的提问来源于stack exchange,提问作者MIRACLE SAMUEL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 12:45:36