如何对价格数组排序去重并获取指定排序位次的数值?
价格数组排序去重并取对应位次数值的实现方案
原代码存在的问题
- 去重逻辑错误:原代码中
tempArray[j] = tempArray[i-1]的逻辑位置、判断逻辑都不正确,当i=0时还会出现下标-1的内存越界问题,同时没有把排序后的最后一个元素纳入去重范围,会导致结果缺失。 - 无参数校验:没有判断输入的size是否合法、order是否超过去重后的数组长度,很容易出现非法内存访问问题。
- 变量类型不匹配:size参数为int类型,但循环迭代变量用了无符号的size_t,遇到size为负的极端场景会出现逻辑异常。
修正后的实现代码
int lowestPrice(int array[], int size, int order) { // 入参合法性校验,错误返回值可根据自身业务需求调整 if (size <= 0 || order < 0) { return -1; } int tempArray[size]; // 拷贝原数组,避免修改原始数据 for (int i = 0; i < size; i++) { tempArray[i] = array[i]; } // 升序排序,沿用你原本使用的选择排序逻辑 for (int i = 0; i < size; i++) { for (int j = i; j < size; j++) { if (tempArray[j] < tempArray[i]) { int tmp = tempArray[i]; tempArray[i] = tempArray[j]; tempArray[j] = tmp; } } } // 数组去重逻辑 int uniqueLen = 0; for (int i = 0; i < size; i++) { // 首元素直接保留,后续元素仅和上一个已保留元素不同时才留存 if (i == 0 || tempArray[i] != tempArray[uniqueLen - 1]) { tempArray[uniqueLen] = tempArray[i]; uniqueLen++; } } // 校验位次是否超出去重后的数组长度 if (order >= uniqueLen) { return -1; } // 返回对应位次数值,order从0计数:0=最低价、1=次低价,以此类推 return tempArray[order]; }
使用说明
- 9个价格数组分别调用该函数即可得到对应位次的价格数值,不会修改原始数组内容。
- 如果需要位次从1开始计数(比如传1返回最低价),只需要把最终return语句里的
order改为order-1即可。
内容的提问来源于stack exchange,提问作者kan3
相关产品推荐
相关产品推荐

