题目:删除数组中值为val的数,并返回新数组的长度,时间复杂度为O(n).
解法一:只要求时间复杂度,可以以空间换时间,遍历数组,同时将数组中值不为val的数复制到新数组中;
解法二:(在其他博客上有看到同样的题,也有同时要求空间复杂度为O(1)的,这种情况可以选用双指针法(虽然我的真题中没有要求,但是学一下不为过~万一考到了呢~嘻嘻~)
解法一:一次遍历
#include <stdio.h>
#include <stdlib.h>
int* selectnoval(int nums[],int numsize,int val,int* returnsize)
{
//创建动态数组作为新数组
int* result = (int*)malloc(numsize*sizeof(int));
*returnsize = 0; //一开始结果数组是空的
int i;
for(i=0;i<numsize;i++)
{
if(nums[i]!=val)
result[(*returnsize)++]=nums[i];
}
return result;
}
int main()
{
int nums[] = {1,3,2,13,9,13};
int val = 13 ;
int numsize = sizeof(nums)/sizeof(nums[0]);
int returnsize;
int* result = selectnoval(nums,numsize,val,&returnsize); //returnsize一定要取地址!!!
printf("%s %d\n","新数组的长度是:",returnsize);
//易错点:不可用sizeof(nums)/sizeof(nums[0])来计算结果数组的长度
//因为result不是一个数组,而是指向数组起始地址的指针
printf("%s","得到的新数组为:");
int i;
for(i=0;i<returnsize;i++)
printf("%d ",result[i]);
return 0;
}
解法二:双指针法
#include <stdio.h>
#include <stdlib.h>
int selectnoval(int* nums,int numsize,int val)
{
int head=0,size=0;
while(head<numsize)
{
if(nums[head]!=val)
nums[size++] = nums[head];
head++;
}
return size;
}
int main()
{
int nums[] = {1,3,2,13,9,13};
int val = 13;
int numsize = sizeof(nums)/sizeof(nums[0]);
int size = selectnoval(nums,numsize,val);
printf("%s%d\n","新数组的长度为:",size);
printf("%s","得到的新数组为:");
int i;
for(i=0;i<size;i++)
printf("%d ",nums[i]);
return 0;
}
易错点总结!!!
1.该题与之前返回平方的那个题不同,之前那题是长度相等,而这题长度不等,特别注意*returnsize的赋值!
*returnsize = 0; //一开始结果数组是空的
2.新数组长度计算
printf("%s %d\n","新数组的长度是:",returnsize);
//不可用sizeof(nums)/sizeof(nums[0])来计算结果数组的长度
因为result不是一个数组,而是指向数组起始地址的指针