数组多数元素求解:补全C#代码中if条件逻辑
数组多数元素求解(摩尔投票法)
问题分析
你用的是摩尔投票法来寻找多数元素,这个算法核心是通过两两抵消不同元素,最终剩下的元素就是多数元素(前提是数组中确实存在出现次数超过n/2的多数元素)。你的代码框架接近正确,但有两处关键问题:
- 循环起始索引错误:初始已经把
major设为nums[0]并计数为1,循环得从i=1开始,避免重复处理第一个元素。 - 第一个
if的条件缺失:当计数count归0时,说明之前的候选元素已被完全抵消,需要更换候选为当前元素。
修正后的完整代码
using System; public class Program { public static void Main(String[] args) { int n = int.Parse(Console.ReadLine()); int[] num = new int[n]; for (int i = 0; i < n; i++) { num[i] = int.Parse(Console.ReadLine()); } Console.WriteLine(MajorityElement(num)); } public static int MajorityElement(int[] nums) { int major = nums[0]; int count = 1; // 从第二个元素开始遍历,避免重复处理初始候选 for (int i = 1; i < nums.Length; i++) { // 计数归0时,更换候选元素并重置计数 if (count == 0) { major = nums[i]; count = 1; } else { if (major == nums[i]) { count++; } else { count--; } } } return major; } }
关键逻辑说明
- 初始状态:将数组第一个元素设为候选多数元素
major,计数count初始化为1。 - 遍历过程:
- 若
count为0,说明之前的候选已被完全抵消,把当前元素设为新候选,计数重置为1。 - 若当前元素等于候选
major,计数加1;否则计数减1(相当于抵消一个候选元素)。
- 若
- 最终返回的
major就是多数元素——因为多数元素出现次数超过数组长度的一半,最终不会被完全抵消。
内容的提问来源于stack exchange,提问作者Rodrigo M
相关产品推荐
相关产品推荐

