提示:以下是本篇文章正文内容,下面案例可供参考
一、元素逆序问题
例如:将hello world逆序输出
使用双指针思想,分别用p指向数组首地址,q指向数组最后一个元素地址,只要满足p<q的条件,p所指向的值就和q所指向的值进行交换
void Reverse(char arr[], int size)
{
char* p = arr;
char* q = arr + size - 1;
while (p < q)
{
char ch = *p;
*p = *q;
*q = ch;
p++;
q--;
}
}
二、奇偶数调整问题
例如:整型数组,把偶数调整到数组的左边,把奇数调整到数组的右边
使用p指向数组首地址,q指向数组末尾元素的地址,如果p是奇数,q是偶数则相互交换,否则p++,q–使其满足条件。
void AdjustArray(int arr[],int size)
{
int* p = arr;
int* q = arr + size - 1;
while (p < q)
{ //p->奇数
if ((*p & 0x1) == 0)
{
p++;
continue;
}
//q ->偶数
if ((*q & 0x1) == 1)
{
q--;
continue;
}
//p->奇数 q->偶数
int tmp = *p;
*p = *q;
*q = tmp;
p++;
q--;
}
}
代码优化后
代码优化可使q不为偶数时,不再判断p是否为奇数,一定程度上减少了判断的次数
void AdjustArray(int arr[],int size)
{
int* p = arr;
int* q = arr + size - 1;
while (p < q)
{
//p->奇数
while (p < q)
{
if ((*p & 0x1) == 1)
{
break;
}
p++;
}
//q ->偶数
while (p < q)
{
if ((*q & 0x1) == 0)
{
break;
}
q--;
}
//p->奇数 q->偶数
if (p < q)
{
int tmp = *p;
*p = *q;
*q = tmp;
p++;
q--;
}
}
}
三、移除元素问题(力扣27题)
类似与第二题,使数组左边元素为非val值。
int removeElement(int* nums, int numsSize, int val){
int *p=nums;
int *q=nums+numsSize-1;
while(p<=q)
{
//q<-找不等于val的元素
if(*q==val)
{
q--;
continue;
}
if(*p==val)
{
*p=*q;
q--;
}
p++;
}
return p-nums;
}