
给了两个非递减顺序数组,m和n分别代表nums1和nums2的元素数目,合并nums1和nums2数组,并且使之合并为非递减顺序排列
因为是两个非递减顺序数组,这里就不需要我们自己排序了,这里我们知道m和n,此时就可以得出合并后数组的元素个数为m+n,首先取nums1数组最后一位下标l1=m-1,nums2数组最后一位下标l2=n-1,合并后数组最后一位下标m+n-1,接着我们让nums1和nums2从最后开始遍历,大的放到最后一位,此时再让下标--即可,若最后数组还剩有元素没有放完,在将没放完数组全部放进去即可,因为我们是非递减顺序数组,越往前数组的元素肯定越小
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int l1=m-1;
int l2=n-1;
int l3=m+n-1;
while(l1>=0&&l2>=0)
{
if(nums1[l1]>nums2[l2])
{
nums1[l3--]=nums1[l1--];
}
else
{
nums1[l3--]=nums2[l2--];
}
}
while(l2>=0)
{
nums1[l3--]=nums2[l2--];
}
}时间复杂度:O(M+N) 注:但是复杂度不是这样写的,最后写成O(N) 这里如果大家对算法复杂度不清楚的话,大家可以参考下我的这篇博客,里面详细讲解了计算算法复杂度的规则:【数据结构初阶】--算法复杂度详解


给了一个[0,n]的数组,找出没有出现在这个范围内的数字
我们可以将数组先排好序,因为排好序的数组,数组下标和数字是一一对应的,此时我们只要找出来数组下标与数组元素不相同的元素,返回数组下标即可
int cmp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
int missingNumber(int* nums, int numsSize){
qsort(nums,numsSize,sizeof(nums[0]),cmp);
int i=0;
while(i<numsSize)
{
if(nums[i]==i)
{
++i;
}
else
break;
}
return i;
}时间复杂度:Nlogn


有两个字符串s和t,在字符串t中添加一个字母,找出添加的字母即可
我们可以将字符串s和字符串t进行排序,让s和t中的字符全部相加,s和t的差值就是添加的字符
char findTheDifference(char* s, char* t)
{
int snum=strlen(s),tnum=strlen(t);
int scount=0,tcount=0;
for(int i=0;i<snum;i++)
{
scount+=s[i];
}
for(int i=0;i<tnum;i++)
{
tcount+=t[i];
}
return tcount-scount;
}时间复杂度:O(N)

往期回顾:
总结:这篇博客给大家找了三个排序类的题目,题目难度都很简单,其中涉及了许多函数,大家可以通过查漏补缺来弥补自己不清楚或者是忘却的知识,这里把有关这篇博客的知识点总结了一下,大家可以通过回顾之前的博客来进行复习
结语:最后希望大家可以每天练一道算法题,来帮助自己提高算法能力,算法不是一蹴而就,而是通过一朝一夕的坚持刷题而积累的!大家感兴趣的话可以先看一下往期回顾中的几篇文章,都是对于数据结构来说比较重要的一些C语言知识储备,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。🌹🌹🌹