为何我的多数元素求解代码在LeetCode与InterviewBit上无法通过?
你的代码不正确的原因及修正方案
你的代码存在两个核心问题:
1. 类型丢失/错误转换
PHP的array_count_values()函数会将类型不同但值相等的元素视为同一个值进行统计:
- 布尔值
true会被转换为整数1,false转换为整数0 - 字符串形式的数字(如
"1")会被转换为整数1
之后使用array_flip()交换键值时,返回的是转换后的类型值,而非原数组中的多数元素本身。比如:
- 输入数组
[false, false, true],多数元素是false,但你的代码会返回0 - 输入数组
["1", "1", 2],多数元素是"1",但你的代码会返回整数1
2. 潜在的键冲突风险(虽题目保证多数元素存在,但仍需注意)
如果存在多个元素出现次数相同(题目中此情况不可能发生),array_flip()会覆盖之前的键值对,导致返回错误的元素。
修正后的代码
方案1:遍历统计结果(保留原元素类型)
function majorityElement($a){ $counts = array_count_values($a); $maxCount = 0; $majority = null; foreach ($counts as $element => $count) { if ($count > $maxCount) { $maxCount = $count; $majority = $element; } } return $majority; }
方案2:摩尔投票法(更高效,空间复杂度O(1))
利用多数元素出现次数超过floor(N/2)的特性,无需额外空间统计次数:
function majorityElement($a){ $candidate = $a[0]; $count = 1; for ($i = 1; $i < count($a); $i++) { if ($count == 0) { $candidate = $a[$i]; $count = 1; } else if ($a[$i] === $candidate) { $count++; } else { $count--; } } return $candidate; }
内容的提问来源于stack exchange,提问作者Luke Dobner
相关产品推荐
相关产品推荐

