备战蓝桥杯第一节

本文介绍了数组相关的基本C语言函数如memset、memcpy、gets、scanf等,以及字符串处理函数如strlen、strcpy等,并通过LeetCode题目展示了数组和指针在实际编程中的应用,强调了理解和实践的重要性。
摘要由CSDN通过智能技术生成

这里展示一下我最近回顾的一些常用的与数组相关的函数和我做的题,每个做的题都有分析

这是我找到一些常用函数:

1.memset(void *s,char ch,unsigned n),对字节型数组赋值,对非字节型数组清0。string.h 和memory.h,例如:
int  a[2][3];
    memset(a, 0, 6 * sizeof(int));

2.memcpy(void *d,void *s,unsigned n)以为s开头的地址的后n位复制拷贝到以d开头的。string.h 和memory.h,例如:int  b[2][3];
    memcpy(b, a, 6 * sizeof(int));
3.char  str[80];
        gets (str);
//输入字符串为字符数组,不可以包含空格

3.char  str[80];
        scanf ("%s", str);
//输入字符串为字符数组,以空格或者回车结束,%ns格式控制符 限制输入的字符个数,可以用多个字符串

4.puts(字符串地址)                              //应包含的.h文件为stdio.h,向显示器输出字符串(输出完,换行)

5.strlen(字符串地址)       //应包含的.h文件为string.h ,计算字符串长度,以‘/0’结束

6.strcpy (字符数组1,字符串2)          //应包含的.h文件为string.h,将字符串2拷贝到字符数组1中去

7.strncpy (字符数组1, 字符串2, 长度n) 
            //应包含的.h文件为string.h,将字符串2的前n个字符复制到字符数组1中去,但并未在末尾加'\0',因此要手动加‘/0’

8.strcmp (字符串1, 字符串2)                  //应包含的.h文件为string.h,比较两个字符串
,返回int型整数。a. 若字符串1< 字符串2,   返回负整数
-1
strncmp (字符串1, 字符串2, 长度n)      //应包含的.h文件为string.h

9.qsort(void *s,int n,int size,排序原则) 详情见:https://blog.csdn.net/Cooler_z/article/details/122384559
例如:

int cmp(const void *a,const void *b) {
    return *(int*)a-*(int*)b;
}
qsort(num, n, sizeof(int), cmp);

这个可以参考:C语言排序神器——qsort函数(看这一篇,足矣)_我的代码no摆烂的博客-CSDN博客

或许还可能结合一下指针函数:malloc() 、calloc()、free()等等

我做的题:暂时就三(嘿嘿,蛮不好意思的)

1、力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台,这是题的链接

int findMiddleIndex(int* nums, int numsSize) {

    int total = 0;

    for (int i = 0; i < numsSize; ++i) {

        total += nums[i];

    }

    int sum = 0;

    for (int i = 0; i < numsSize; ++i) {

        if (2 * sum + nums[i] == total) {

            return i;

        }

        sum += nums[i];

    }

    return -1;

}

//由于中间下标的数左边等于右边,因此数组的和=中间下标的数+中间下标的数的左边或者右边所有的值*2

先有for循环计算总和,在用for循环遍历,直到满足上面的等式,并输出下标,否则输出-1; 

2、 LCR 068. 搜索插入位置 - 力扣(LeetCode),这是题的链接

int searchInsert(int* nums, int numsSize, int target){

    int i,num;

    for(i=0;i<numsSize;i++){

        if(target==nums[i]) num = i;

        if(target > nums[i]) num = i+1;

        if(target < nums[0]) num=0;

    }

    return num;

}//第一种

int searchInsert(int* nums, int numsSize, int target) {

    int left = 0, right = numsSize - 1, ans = numsSize;

    while (left <= right) {

        int mid = ((right - left) >> 1) + left;

        if (target <= nums[mid]) {

            ans = mid;

            right = mid - 1;

        } else {

            left = mid + 1;

        }

    }

    return ans;

}

//第二种、在左边取一个索引,右边取一个索引,然后取它的中间值索引(偶数为前一个),答案暂定为最后一位索引+1;我们设立一个循环结束条件,左边索引的数小于右边索引的数。如果判断我们要找的数在右边,就以中间右边的索引当做左边,开始新的取中间值计算,如果我们要找的数在右边或已经找到要找的数,就以中间左边的索引当做右边,中间值作为最后一位,开始新的取中间值计算。

经过一系列运算之后,如果右边的索引值大于左边的索引值,那么下一步的条件就不成立了,现在的中间值就是我们要找的值。反之就直到使得右边的索引值大于左边的索引值,直到找到结果。 

 

3、 66. 加一 - 力扣(LeetCode),这是题的位置

int* plusOne(int* digits, int digitsSize, int* returnSize) {

    int CF = 0; // 进位标志

    int ptr = digitsSize - 1; // 从数组的最后一个元素开始处理

    // 处理加一操作

    do {

        if (ptr >= 0) {

            digits[ptr]++; // 当前位加一

            CF = digits[ptr] / 10; // 计算进位

            digits[ptr] %= 10; // 如果当前位是10,则变为0

            ptr--; // 指针移动到前一位

        } else {

            // 如果所有位都进位了,则需要在数组前面增加一位

            int* newDigits = (int*)malloc((digitsSize + 1) * sizeof(int)); // 分配新的内存空间

            newDigits[0] = 1; // 新的最高位设为1

            for (int i = 1; i <= digitsSize; i++) {

                newDigits[i] = digits[i - 1]; // 复制原数组到新数组

            }

            *returnSize = digitsSize + 1; // 更新返回数组的大小

            return newDigits; // 返回新的数组

        }

    } while (CF); // 如果有进位则继续循环

    *returnSize = digitsSize; // 如果没有增加新的位数,则返回大小不变

    return digits; // 返回原数组

}

整体框架:从数组的最后一位开始判断,判断它+1后是否进位,如果是,那么在判断它是否继续进位,因此我们就要设置一个用于表示是否进位的数,还需要一个循环,因为是先比较,在进位判断,所以我们用先do,再whlie。这样当要进位就继续循环,否则结束。

处理数据:现在我们开始处理里面的数据了,我们从“个”位开始,也就是数组的最后一位,当我们进位后,就判断“十”位是否要进位,如此循环,直到索引为0,计算的进位是digits[ptr] / 10,进位或者没有进位后的是 digits[ptr] % 10;

特殊情况:如果我们判断数组的每一位都进位了,就会导致ptr为负数,那么我们就建立一个新的数组,并把原来处理好的数组,的第一位加1,这里应该是先+1,在用循环把旧数组的内容复制到新数组,然后修改数组大小,返回新数组

 

最后结尾:在上面这些题,让我看到了数组结合指针的更多可能性,让我明白怎么合理利用循环、数组、指针。最后的最后这些题让我意识到了自己的不足之处、毕竟有些的自己真的没做出来,都是看别人的再敲一遍,然后深刻理解。路很漫长、愿我坚持不懈。

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

years_GG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值