C语言之练习题

在这里插入图片描述

欢迎来到我的:世界

希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 !


前言


填空题:

第一题

在这里插入图片描述

题解思路:
该题考察的是我们对运算符优先级掌握+对二维数组的理解;
百度:运算符优先级详解;X[ i ][ j ] 表达式中下标引用操作符优先级是最高的;所以是先如果拆开就可以更好理解其结构:
在这里插入图片描述
接下来依次看选项:选项A:*(X[ i ]+j);
下标引用操作符“ [ ] ”是比括号“( )”的优先级高的,既然是一个二维数组,可以看成是一个一维数组的集合;而这个选项是与X[i][j] 等效的;
选项B:*X( i )[ j ]; 要知道“[ ]”是先于“ * ”的,所以先是下标引用操作符先进行操作,这本就是一个错误的表达式;
选项C:*(X+i+j); 这个选项可以理解为X[i+j] 这完全和X[i][j]不相符;
选项D:((X+i)+j);这个选项可以知道与X[i][j]相符;

第二题

在上下文及头文件均正常的情况下,下列代码的输出是( )在这里插入图片描述

解题思路:
这题看似比较简单,但是有个小细节不注意可能就一盘皆输;一个函数递归问题
递归输出“Geneius”,按理输出的是“suieneG”,但这里需要特别注意:第一次递归输入的是++s,跳过了“G”,这也就没有G的打印;
在这里插入图片描述
所以最终输出的是:suiene

第三题

下列 for 循环的次数为( )

for(int i = 0 ; i || i++ < 5;);

解题思路:
这题考察的是逻辑“或”,逻辑“或”,有真则为真,两者都为假则为假; 刚刚进入循环,i=0;进入判断条件,i为0代表的是假,则看i++<5,此表达式进行了计算,此为真,则进入循环,当第二次循环时i已经++了,则i=1 此代表为真,则不会在进入i++<5表达式了; i不会进行变化,所以该表达式会陷入死循环;

次数应该是:无限次;

第四题

在这里插入图片描述

A选项,没有考虑内存对齐。 B选项,考察double类型的比较,由于浮点数存在误差,不能直接判断两个数是否相等,通常采用比较两数之差的绝对值是否小于一个很小的数字(具体的可自己设定这样一个数,作为误差)来确定是否相等。 C选项,a为数组首地址是常量不能改变, 所以A,B,C都是错的,选择D


编程题:

第一题:


地址:oj地址


在这里插入图片描述

解题思路:排序+双指针
首先对两个数组进行排序,然后使用两个指针遍历两个数组。 然后创造一个存放相交元素的数组 arr ;可以预见的是加入arr 数组的元素一定是递增的, 再为了保证加入元素的唯一性,我们需要额外记录变量 prve 表示上一次加入答案数组的元素。
初始时,两个指针分别指向两个数组的头部。
然后每次比较两个指针指向数组中的元素,若不相等,较小的指针向右移动一位;若相等,则判断为不等于prve,不是则将该存入用来存放相交数组arr中,并且更新一下prve的值,将prve的值改成刚刚相交元素的值; 然后两个指针同时向右移动一位,当至少有一个指针超出数组范围时,遍历结束。

代码:

int cmp (const void *e1,const void*e2)
{
    return *(int*)e1-*(int*)e2;
}

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
    //首先进行排序
    qsort(nums1,nums1Size,sizeof(int),cmp );
    qsort(nums2,nums2Size,sizeof(int),cmp );
    //创造一个数组存放相交的数组
    int *arr=(int*)malloc(sizeof(int) * (nums1Size + nums2Size));
    //设置两个指针
    int sur1=0;
    int sur2=0;
    int prve=-1;//记录上一个的相交值,判断是否要存入
    int j=0;
    while(sur1<nums1Size && sur2<nums2Size)
    {
        int num1=nums1[sur1],num2=nums2[sur2];
        if(num1==num2)
        {
            if(prve!=num1)//判断出不是相同的相交值
            {
                arr[j]=num1;
                j++;
                prve=num1;
                sur1++;
                sur2++;
            }
            else
            {
                sur1++;
                sur2++;
            }
        }
        else if(num1<num2)
        {
                sur1++;
        }
        else
        {
            sur2++;
        }
    }
    *returnSize=j;//相交数组个数
    return arr;
}

第二题:


地址:oj地址


在这里插入图片描述

解题思路:
先算出该数组中所以元素和记到total;当遍历到 i 时,其左侧元素之和为 sum ,那其右侧元素之和为 total- nums[i] - sum;当左右元素和相等的时候就有等式:2*sum + nums[i] =total;
在这里插入图片描述

代码:

int pivotIndex(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;
}

总结

知识是无穷的,探索的路上是枯燥的,让我来分享一下乐趣:
鲁迅说过:打断你的腿,再给你一副拐杖,然后告诉你,没有他你连走路都走不了,所以要学会感恩。


到了最后:感谢支持

我还想告诉你的是:
------------对过程全力以赴,对结果淡然处之
也是对我自己讲的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值