第五天!!!!!!
——————————————————————————————————
学习内容正向着不可描述的地步迈进!!!
开始!
这次我们来学指针,数组,函数这三个之间微妙的关系,(不可描述的那种)
主要还是以排序题型的形式来体现出来(但是今天不学排序算法哈,虽然我也挺想学的)
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;
}
——————————————————————————————————————————————————
触碰到知识盲区了,感觉有点跟不上了!
但这个才是我需要的,我需要的不是来这里刷对多少题,
而是不了解多少知识,学会它!!!加油吧打卡之后,把盲点排一排!
又花了时间学盲点,晚了一些