满意答案
ckchanel0
2013.12.24
采纳率:58% 等级:7
已帮助:159人
这个题目的解题思路为:因为数组a已非递减有序,所以一般先对其进行二分查找,但要找到第一个x所在的下标,然后再对其进行删除。
int BitSearch(int a[], int x, int left, int right) { /*在数组a的从left到right的区域内二分查找x第一次出现的位置,如果不存在返回-1*/
int mid, i;
while(left <= right) {
mid = (left + right) / 2;
if(a[mid] == x) break;
if(a[mid] > x) right = mid - 1;
if(a[mid] < x) left = mid + 1;
}
if(left > right) return -1;
for(i = mid; i >= left && a[i] == x; i--); //寻找第一个x的位置
return i + 1;
}
void Romove(int a[], int *length, int index) {
int i;
if(index < 0 || index >= *length) return ; //删除的位置越界
for(i = index; i < *length - 1; i++) a[i] = a[i + 1];
*length--;
}
void delSq(int a[], int x, int *length) {
int index = BitSearch(a, x, 0, *length - 1);
Remove(a, length, index);
}
00分享举报