一、
算法思路:
遍历数组对数组内元素进行遍历,遇到元素为1时计数count++,当遇到0时比较result和count把最大值赋给result,并且把count置为0,继续遍历剩下的数组元素。
注意:当遍历完数组后没有把最大值赋给result,所以在printf时应该打印max值,把最后一次count也跟之前的result比较。
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int arr[]={1,1,0,1,1,1};
int count=0,result=0;
int i;
int size=sizeof(arr)/sizeof(arr[0]);
// printf("%d",size);
for(i=0;i<size;i++)
{
if(arr[i]==1)
{
count++;
}
else
{
result=max(result,count);
count=0;
}
}
printf("result=%d\n",max(result,count));
return 0;
}
int max(int a,int b){
int ret;
if(a>b)
ret=a;
else
ret=b;
return ret;
}
二、
先对数组进行遍历,把不等于0的数都放到数组左侧,最后将数组右侧值置为0;
#include <stdio.h>
int main(int argc, char *argv[])
{
int arr[]={0,1,0,3,12};
int index=0,i=0;
int size=sizeof(arr)/sizeof(arr[0]);
for(i=0;i<size;i++)
{
if(arr[i]!=0)
{
arr[index]=arr[i];
index++;
}
}
for(i=index;i<size;i++)
{
arr[i]=0;
}
for(i=0;i<size;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
二、
由于题目要求删除数组中等于 val 的元素,因此输出数组的长度一定小于等于输入数组的长度,我们可以把输出的数组直接写在输入数组上。可以使用双指针:右指针 right\textit{right}right 指向当前将要处理的元素,左指针 指向下一个将要赋值的位置。
如果右指针指向的元素不等于 val,它一定是输出数组的一个元素,我们就将右指针指向的元素复制到左指针位置,然后将左右指针同时右移;
如果右指针指向的元素等于 val,它不能在输出数组里,此时左指针不动,右指针右移一位。
整个过程保持不变的性质是:区间 [0,left) 中的元素都不等于 val。当左右指针遍历完输入数组以后,left 的值就是输出数组的长度。 这样的算法在最坏情况下(输入数组中没有元素等于 val),左右指针各遍历了数组一次。
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int arr[]={0,1,2,2,3,0,4,2};
int value=2;
int size=sizeof(arr)/sizeof(arr[0]);
int left=0,right;
for(right=0;right<size;right++)
{
if(arr[right]!=value)
{
arr[left]=arr[right];
left++;
}
}
printf("%d\n",left);
return 0;
}