首页 > 其他分享 >学习日记--(复习qsort、学习枚举、指针)

学习日记--(复习qsort、学习枚举、指针)

时间:2022-10-13 23:34:07浏览次数:57  
标签:p2 p1 cur -- qsort int 枚举 nums1 nums2

1、两数之和

方法一:暴力枚举

思路:枚举数组中每一个数,寻找之后的数字是否存在target-x。

int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    for (int i = 0; i < numsSize; ++i) {
        for (int j = i + 1; j < numsSize; ++j) {//不光要看数组中的x也就是每一个数都要检查一遍,还要对之后的数字进行检查,所以两层循环
            if (nums[i] + nums[j] == target) {
                int* ret = malloc(sizeof(int) * 2);//sizeof(int)意思是int数据类型的所占字节数,malloc分配内存函数对应的释放函数为free,malloc返回void*类型,地址赋给ret,ret是int类型的指针,指针是数组名,表示数组第一个元素的起始地址
                ret[0] = i, ret[1] = j;
                *returnSize = 2;//returnsize表示输出的值的个数,所以要赋值,因为要输出i,j,所以赋值为2
                return ret;
            }
        }
    }
    *returnSize = 0;//如果循环里没找出来,说明没有,就不用赋值了
    return NULL;
}

方法二:构建哈希函数,可惜目前只会数字计算哈希函数找出地址,不会代码

2、合并两个有序数组

方法一:直接合并后排序

用了刚学过的qsort函数,注意cmp函数的写法,还有题目没说要输出,只是要保存。

方法二:双指针

将两个数组看作队列,每次从两个数组头部取出比较小的数字放到结果中

为两个数组分别设置一个指针p1,p2,作为队列的头部指针

 1 void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
 2     int p1 = 0, p2 = 0;
 3     int sorted[m + n];//定义一个大小为m+n的名为sorted的数组
 4     int cur;//定义一个叫做cur的整型变量
 5     while (p1 < m || p2 < n) {//p1,p2相当于指针,虽然没给他分配内存
 6         if (p1 == m) {//说明此时(上一步更新的p1)已经走到nums1的尾部的后一个位置,接下去把nums2继续放入sorted数组就行
 7             cur = nums2[p2++];//此时cur=nums2[p2],p2=p2+1
 8         } else if (p2 == n) {//此时(上一步更新的p2)已经走到nums2尾部的后一个位置,把nums1的数值放到新数组就行
 9             cur = nums1[p1++];//此时cur=nums1[p1],p1=p1+1
10         } else if (nums1[p1] < nums2[p2]) {//选出小的更新sorted数组
11             cur = nums1[p1++];
12         } else {
13             cur = nums2[p2++];
14         }
15         sorted[p1 + p2 - 1] = cur;//用cur的数值更新sorted数组
16     }
17     for (int i = 0; i != m + n; ++i) {
18         nums1[i] = sorted[i];//根据题目要求,把sorted数组赋给nums1[]
19     }
20 

方法三:逆向双指针
p1、p2两个指针从nums1、nums2两个队列的末尾往前进行比较,较大的放到nums1的后面(在长度为m+n的n及之后的位置)

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int p1 = m - 1, p2 = n - 1;//从nums1(非0的最后一个数字的位置),nums2最后一个位置
    int tail = m + n - 1;//nums1的尾部位置为m+n-1
    int cur;
    while (p1 >= 0 || p2 >= 0) {
        if (p1 == -1) {//nums1已经遍历完了,用nums2[p2]更新nums1的尾部
            cur = nums2[p2--];
        } else if (p2 == -1) {//nums2已经遍历完了,用nums1[p1]更新
            cur = nums1[p1--];
        } else if (nums1[p1] > nums2[p2]) {//选出较大的更新
            cur = nums1[p1--];
        } else {
            cur = nums2[p2--];
        }
        nums1[tail--] = cur;//用变量cur更新nums1
    }
}

 

标签:p2,p1,cur,--,qsort,int,枚举,nums1,nums2
From: https://www.cnblogs.com/zhishiyigenicheng/p/16790101.html

相关文章

  • 动手实验:继承条件下的构造方法调用
    -子类自动拥有父类声明为public和protected的成员,这就是继承特性的体现之一。-public:外界可自由访问-private:外界不可访问-protected:同一包中的子类都可以访问,另一包......
  • nginx 状态码
    目录nginx状态码nginx状态码100-199用于指定客户端应相应的某些动作。200-299用于表示请求成功。300-399用于已经移动的文件并且常被包含在定位头信息中指定新的......
  • CSS实现水平垂直居中的方式汇总
    原文链接:CSS实现水平垂直居中的1010种方式(https://cloud.tencent.com/developer/article/2035014)一、目录1.1居中元素固定宽高使用absolute+负值marginabsol......
  • pip not found (记录)
    python下载了pippip3找不到如果你还未安装,则可以使用以下方法来安装:$curlhttps://bootstrap.pypa.io/get-pip.py-oget-pip.py#下载安装脚本$sudopythonget......
  • 位运算
    位运算packageoperator;publicclassDemo03{publicstaticvoidmain(String[]args){/*A=00111100B=00001100A&B=00......
  • __main__ --- 最高层级代码环境
    在Python中,特殊名称__main__被用于两个重要的构造:程序的最高层级环境的名称,可以使用__name__=='__main__'表达式来检查它;以及Python包中的__main__.py文件。......
  • 152-《大数据架构师》 Flink JobMaster 启动和 Slot资源管理_ev
                                     ......
  • app自动化测试元素定位
    目录一、前言1、Appium元素定位  1.1、Android页面介绍2、App常用元素定位  1.1、id定位  1.2、UIAutomator定位  1.3、Xpath定位  1.4、cont......
  • 进入python的世界_day14_python基础——算法、三元表达式、生成式、匿名函数
    一、算法1.介绍​ 算法是通过数学模型运算得到某些数据的过程,在python中通过与代码相结合,可以在特定场景下很方便的解决问题2.应用场景​ 很广,大数据推广就是利用算......
  • 微信小程序 —— 保留两位小数
    两种方法一:在utils文件夹中新建一个filters.wxs文件将下面代码写入varfilters={toFix:function(value){returnvalue.toFixed(2)//此处2为保留两位小......