题目:给定一个数组,非递减排序,返回每个数的平方组成的新数组,要求也按照非递减排序,时间复杂度为O(n)。
解答:
//返回每个数的平方组成的新数组
#include <stdio.h>
#include <stdlib.h>
int* doublesort(int nums[],int numsize,int* returnsize)
{
//为结果数组分配内存
int* result = (int*)malloc(sizeof(int)*numsize);
*returnsize = numsize;
int i;
int left=0;
int right=numsize-1;
for(i=numsize-1;i>=0;i--)
{
int leftdouble = nums[left]*nums[left];
int rightdouble = nums[right]*nums[right];
if(leftdouble>rightdouble)
{
result[i] = leftdouble;
++left;
}
else
{
result[i] = rightdouble;
--right;
}
}
return result;
}
int main()
{
int nums[] = {-4,-1,0,3,5};
//计算数组个数=数组大小/单个元素大小
int numsize = sizeof(nums)/sizeof(nums[0]);
int returnsize;
//输出结果数组
int i;
int* result = doublesort(nums,numsize,&returnsize);
for(i=0;i<numsize;i++)
{
printf("%d ",result[i]);
}
return 0;
}
!!!今日总结易错点
//1.
*returnsize = numsize; //不能忘记!这是结果数组的大小,是动态数组,所以大小是动态的,故而需要用指针
//2.
return result; //千万不要加* 错误案例:return* result!!!!!!
//3.
//计算数组个数=数组大小/单个元素大小
int numsize = sizeof(nums)/sizeof(nums[0]); //不要写个sizeof就结束了,搞搞清楚!
//4.
int* result = doublesort(nums,numsize,&returnsize);//调用函数里有参数*returnsize请取地址谢谢!
//如果要问为什么,请看这里->
//如果不取地址,而是直接传递returnsize,那么在doublesort函数中对*returnsize的修改将不会影响到main函数中的returnsize