诺亚方舟——第五天

第五天!!!!!!
——————————————————————————————————
学习内容正向着不可描述的地步迈进!!!
开始!
这次我们来学指针,数组,函数这三个之间微妙的关系,(不可描述的那种)
主要还是以排序题型的形式来体现出来(但是今天不学排序算法哈,虽然我也挺想学的)
1.好啦,进入正题,介绍qsort()
排序 API 的作用就是传入一个数组,并且对数组按照给定的规则进行就地排序
qsort函数包含在C 标准库 - <stdlib.h>中
模板:void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*));
    base    指向要排序的数组
    nitems    要排序的数组中元素的个数
    size    数组中每个元素的大小,以字节为单位
    compar    用来比较两个元素的函数,即函数指针

比较函数:int compar(const void *p1, const void *p2);
返回值为-1 、 1 、 0 的排序问题
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
当后一个对象比当前对象大,返回结果值为1时,前后交换,说明是倒序排列。
当后一个对象比当前对象小,返回结果值为1时,前后交换,说明是升序排列。

代码例子:
#include<stdio.h>
#include<stdlib.h>

int cmp(const void *a,const void *b)/*函数返回1,前一个元素要 
                                    放在后一个元素后面 */ 
{
    return *(int *)a-*(int *)b;//升序
    //降序 *(int *)b-*(int *)a;
}
int main()
{
    int nums[]={1,3,5,7,2,4,7,9,16};
    int numsSize=sizeof(nums)/sizeof(int);
    qsort(nums,numsSize,sizeof(int),cmp);
    for(int i=0;i<numsSize;i++)
    {
        printf("%d\n",nums[i]);
    }
    
    return 0;
}
后面越来越难,自己越来越不容易上手了,就只能先水一下题了
————————————————————————————————————————————————————————
课后习题:
1.力扣 912.排序数组
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 int cmp(const void *a,const void *b)
 {
     return *(int *)a-*(int *)b;
 }
int* sortArray(int* nums, int numsSize, int* returnSize){
    qsort(nums,numsSize,sizeof(int),cmp);
    *returnSize=numsSize;
    return nums;
}
2.力扣  169.多数元素
int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}
int majorityElement(int* nums, int numsSize){
    qsort(nums,numsSize,sizeof(int),cmp);
    return nums[numsSize/2];
}
3.力扣 217.存在重复元素
int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}
bool containsDuplicate(int* nums, int numsSize){
    int i;
    qsort(nums,numsSize,sizeof(int),cmp);
    for(i=1;i<numsSize;i++)
    {
        if(nums[i]==nums[i-1])
            return true;
    }
    return false;
}
4.力扣 164.最大间距
int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}

int maximumGap(int* nums, int numsSize){
    int max=0;
    if(numsSize==1)
        return 0;
    else
        {
            qsort(nums,numsSize,sizeof(int),cmp);
            for(int i=1;i<numsSize;i++)
            {
                max=max>nums[i]-nums[i-1]?max:nums[i]-nums[i-1];
            }
        }
    return max;
}
5.力扣 905.按奇偶排序数组(其实可以不用这样,也可以实现)
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int Qua(int n){
    return n&1;//判断奇偶数
}
int cmp(const void *a,const void *b)
{
    return Qua(*(int *)a)-Qua(*(int *)b);
}
int* sortArrayByParity(int* nums, int numsSize, int* returnSize){
    qsort(nums,numsSize,sizeof(int),cmp);
    *returnSize=numsSize;
    return nums;
}
接下来用自己方法去实现一下:
#include<stdio.h>
#include<stdlib.h>

int main()
{
    int i,j=0;
    int nums[]={1,3,5,7,2,4,7,9,16};
    int numsSize=sizeof(nums)/sizeof(int);
    int *ret=(int *)malloc(sizeof(int)*numsSize);
    for(i=0;i<numsSize;i++)
    {
        if(!(nums[i]&1))
        {
            ret[j++]=nums[i];
        }
    } 
    for(i=0;i<numsSize;i++)
    {
        if(nums[i]&1)
        {
            ret[j++]=nums[i];
        }
    }
    for(int i=0;i<numsSize;i++)
    {
        printf("%d\n",ret[i]);
    }
    
    return 0;
}


6.力扣 539.最小时间差//属实不会
int cmp(const void *a, const void *b) {
    return *(int *)a - *(int *)b;
}

int min(int a, int b) {
    return a < b ? a : b;
}

int findMinDifference(char ** timePoints, int timePointsSize){
    int *ret = (int *) malloc( sizeof(int) * timePointsSize );
    int i, ans = 1440;
    int a, b;
    for(i = 0; i < timePointsSize; ++i) {
        sscanf(timePoints[i], "%d:%d", &a, &b);             // (1)
        ret[i] = a * 60 + b;                                // (2)
    }
    qsort(ret, timePointsSize, sizeof(int), cmp);           // (3)
    for(i = 1; i < timePointsSize; ++i) {
        ans = min(ans, ret[i] - ret[i-1]);                  // (4)
    }
    ans = min(ans, ret[0] - ret[timePointsSize-1] + 1440);  // (5)
    return ans;
}

知识盲区:
sscanf():从一个字符串中读进与指定格式相符的数据
例子:
很好玩!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
    char str[100];
    //取指定长度的字符串 
    sscanf("12345","%4s",str);//%后的数字是指定长度 
    printf("用法一\nstr = %s\n",str);
    
    //用法二:格式化时间
    int year,month,day,hour,minute,second;
    sscanf("2013/02/13 14:55:34","%d/%d/%d %d:%d:%d",&year,&month,&day,&hour,&minute,&second);
    printf("用法二\ntime=%d-%d-%d %d:%d:%d\n",year,month,day,hour,minute,second);
    
    //用法三: 读入字符串
    sscanf("12345","%s",str);
    printf("用法三\nstr = %s\n",str);
    
    //用法四: %*d 和 %*s 加了星号(*) 表示跳过此数据不读入,(也就是不把此数据读入参数中)
    sscanf("12345acc","%*d%s",str);
    printf("用法四\nstr = %s\n",str); 
    
    //用法五: 取到指定字符为止的字符串,如在下例,取遇到'+'为止字符串
    sscanf("12345+acc","%[^+]",str);
    printf("用法五\nstr = %s\n",str);
    sscanf("520*1314","%[^*]",str);
    printf("str = %s\n",str);
    
    //用法六:取到指定字符集为止的字符串,如在下例中,取遇到小写为止的字符串
    sscanf("12345+acc121","%[^a-z]",str);
    printf("用法六\nstr = %s\n",str);
    
}

7.力扣 976.三角形的最大周长
int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}
int largestPerimeter(int* nums, int numsSize){
    qsort(nums,numsSize,sizeof(int),cmp);
    for(int i=numsSize-1;i>=2;i--)
    {
        if(nums[i]<nums[i-1]+nums[i-2])
        {
            return nums[i]+nums[i-1]+nums[i-2];
        }
    }
    return 0;

}

8.力扣 881.救生艇
int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}
int numRescueBoats(int* people, int peopleSize, int limit){
    qsort(people,peopleSize,sizeof(int),cmp);
    int l=0,r=peopleSize-1;
    int ship=0;
    while(l<=r)
    {
        if(r==l)
        {
            ship++;
            break;
        }
        else if(people[r]+people[l]>limit)
        {
            r--;
            ship++;
        }
        else
        {
            l++;
            r--;
            ship++;
        }

    }
    return ship;

}
——————————————————————————————————————————————————
触碰到知识盲区了,感觉有点跟不上了!
但这个才是我需要的,我需要的不是来这里刷对多少题,
而是不了解多少知识,学会它!!!加油吧打卡之后,把盲点排一排!

又花了时间学盲点,晚了一些

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值