1
一个数组找出最大值和最小值,交换位置
数组为空和数组只有1个元素可以不处理
2
一个数组从第i个元素共删除k个连续元素
分析i ,k有效
Status ListDelete_sq(SqList& L, int i, int k)
{
if (i<1 || i>L.length)
return ERROR; //i不合法
ElemType* p, * q;
p = &(L.elem[i - 1]);//p为被删除元素的位置
q = L.elem + L.length - 1;//指向尾元素
for (++p; p <= q; p++)
*(p - k) = *p;
L.length-=k;
return OK;
}
3
一个数组,奇数全部移到偶数的左边
采用两面夹击的方法 i=0 j=n-1
从左到右找偶数,从右向左找奇数,一但找到就交换
i>=j时结束循环
void Move(SqList& L)
{
int i = 1, j = L.length - 1;
while (i < j)
{
while (L.elem[i] % 2 == 1)i++;
while (L.elem[j] % 2 == 0)j--;
if (i < j)
swap(L.elem[i], L.elem[j]);
}
}
4
一个数组,有正有负,删除所有负整数。
思路与3题类型,让负在右,正在左。
第二个思路,成立一个空表,正的进,负的过。此空表还是本身。
void DeleteMinus(SqList& L)
{
int i, k = 0;
for (i = 0; i < L.length; i++)
if (L.elem[i] >= 0)
{
L.elem[k] = L.elem[i];
k++;
}
L.length = k;
}
5 一个数组 左移p位
a为数组的p位置前面的内容,b为p及后面的内容
a,b分别反转
ab拼起来,然后整体反转
r(R)=r(r(A),r(B))
void reverse(int R[], int m, int n)
{
for (int i = 0; i < (n - m + 1) / 2; i++)
swap(R[m + i], R[n - i]);
}
int ListReverse(int R[], int n, int p)
{
if (p <= 0 || p >= n)return 0;
reverse(R,0,p-1);
reverse(R,p,n-1);
reverse(R,0,n-1);
return 1;
}
|