如何判断第二个整数数组是否为第一个的旋转版本及所需PHP函数
判断第二个数组是否为第一个数组的旋转版本(PHP实现)
核心思路
旋转数组的本质是将原数组拆分为前后两段后交换拼接,比如原数组[1,2,3,4,5,6,7,8]旋转后得到[6,7,8,1,2,3,4,5],相当于把前5个元素和后3个元素交换位置。基于这个特性,将原数组与自身拼接(如A+A)后,所有可能的旋转结果都会是这个拼接数组的子序列。
必要校验与实现步骤
- 基础长度校验:两个数组长度必须完全相同,否则直接判定不是旋转版本。
- 元素一致性校验:确保两个数组的元素组成完全一致(避免出现长度相同但元素不同的情况,比如原数组是
[1,2,3],对比数组是[1,1,4])。 - 子序列匹配:将原数组拼接成
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
相关产品推荐
相关产品推荐

