为何这段删除数组连续重复项的代码无法正常运行?
修复数组连续重复项删除的代码问题
我来帮你排查这两段代码的问题,以及给出可行的修复方案!
首先,你的核心问题在于没有用独立的计数器跟踪结果数组的有效元素位置,而是直接复用原数组的索引来操作结果数组,再加上数组长度固定的特性,导致重复项无法被真正移除,最终返回的数组和原数组一致。
分析Version 1的问题
原代码:
for (int i = 0; i < array.Length; i++) { if (i == 0 || result[i - 1] != array[i]) { result[i] = array[i]; } }
这段代码的问题:
- 当遇到连续重复项时(比如第二个
Truck),你跳过了赋值操作,但result数组的对应位置依然保留着初始值或原数组的重复元素 - 你没有记录有效元素的数量,最后返回的是整个长度的数组,而非只包含去重后元素的部分
修复后的Version 1
string[] array = new[] {"Car", "Truck", "Truck", "Car"}; string[] result = new string[array.Length]; int currentIndex = 0; // 跟踪结果数组的有效元素位置 for (int i = 0; i < array.Length; i++) { // 第一个元素直接添加,或当前元素与结果最后一个有效元素不同时添加 if (currentIndex == 0 || result[currentIndex - 1] != array[i]) { result[currentIndex] = array[i]; currentIndex++; // 有效元素计数+1 } } // 截取有效长度的数组,去掉多余空位 result = result.Take(currentIndex).ToArray();
分析Version 2的问题
你给出的代码片段是:
result[0] = array[0]; for (int i = 1;...
推测你后续的逻辑是直接用i来给result赋值,这和Version 1犯了同样的错误——没有跳过重复项的位置,导致重复元素依然留在数组里。
修复后的Version 2
string[] array = new[] {"Car", "Truck", "Truck", "Car"}; string[] result = new string[array.Length]; result[0] = array[0]; int currentIndex = 1; // 第一个元素已添加,从索引1开始跟踪 for (int i = 1; i < array.Length; i++) { if (result[currentIndex - 1] != array[i]) { result[currentIndex] = array[i]; currentIndex++; } } // 截取有效长度的数组 result = result.Take(currentIndex).ToArray();
更简洁的实现方式
如果允许使用List<T>,代码会更简洁,不需要处理固定数组的长度问题:
string[] array = new[] {"Car", "Truck", "Truck", "Car"}; List<string> result = new List<string>(); foreach (var item in array) { // 列表为空,或当前元素与最后一个元素不同时添加 if (result.Count == 0 || result.Last() != item) { result.Add(item); } } return result.ToArray(); // 转换为数组返回
这样处理后,输入["Car", "Truck", "Truck", "Car"]就能得到预期的["Car", "Truck", "Car"]结果啦!
内容的提问来源于stack exchange,提问作者tetete
相关产品推荐
相关产品推荐

