C语言基础练习——Day15

news2024/9/21 16:25:38

目录

选择题

编程题

寻找奇数

寻找峰值


选择题

1、有如下代码,则*(p[0]+1)所代表的数组元素是

int a[3][2] = {1, 2, 3, 4, 5, 6}, *p[3];
p[0] = a[1];
  • A a[0][1]
  • B a[1][0]
  • C a[1][1]
  • D a[1][2]
答案:C
💡

解析:

本题定义了一个3行2列的二维数组,那么一行最多只能有两个元素,所以按数组元素顺序排列如下图所示

因为数组p为元素类型是指针类型数组,并且第一个元素为二维数组第二行的第一个元素的地址,即a[1][0]的地址,所以*(p[0]+1)为第二行第二列的的元素,

p[0][1] == a[1][1]

2、(多选题)关于指针下列说法正确的是

  • A 任何指针都可以转化为void *
  • B void *可以转化为任何指针
  • C 指针的大小为8个字节
  • D 指针虽然高效、灵活但可能不安全
答案:ABD
💡

解析:

C选项,指针占几个字节要看平台,64位环境下8个字节,32位环境下4个字节,其余选项正确

3、以下scanf函数调用选项中, 错误的是

struct T
{
    char name[20];
    int age;
    int sex;
} a[5], *pa=a;
  • A scanf("%s",a[0].name);
  • B scanf("%d", &pa[0].age);
  • C scanf("%d",&(pa->age));
  • D scanf("%d", pa->age);
答案:D
💡

解析:

该题考察的是通过scanf函数的调用对结构体数据类型进行初始化。scanf("输入控制符", 输入参数);功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。scanf输入时要通过地址找空间,B、C用了&是正确的。name属于字符数组的数组名,相当于数组的首地址,A正确。单独的pa->age可用于输出语句获取值的形式,用在scanf中的时候需要&操作符,D错误

4、如下函数fun计算prod=1*2*3*…*n,并返回计算结果值。但当n>12时,返回值不正确。要找出该程序的错误,正确的调试方法是

int fun(int n)
{
    int prod = 1 , i = 0;
    for(i = 1;i <= n;i++)
    {
        prod *= i;
    }
    return prod;
}
  • A 监视变量prod的值,在prod *= i;行处设置断点,然后单步运行,直到发现错误原因
  • B 监视变量prod的值,在return prod;行处设置断点,程序中断后,即可发现错误原因
  • C 在prod=1;处设置断点,然后在函数调用堆栈中即可发现错误原因
  • D 监视变量i的值,在for (i=1; i<=n; i++)行处设置断点,然后单步运行,直到发现错误原因
答案:A
💡

解析:

依题目已知情况,当n<=12时结果是正确的,说明是随着参数的变大计算过程中哪里出了问题,故而要在prod *= i;处设断点,查看原因。错误原因是数据过大时整型溢出

5、下列给定程序中,函数fun的功能是:把形参a所指数组中的奇数按原顺序依次存放到a[0]、a[1]、a[2]…中,把偶数从数组中删除,奇数个数通过函数值返回。 例如,若a所指数组中的数据最初排列为:9,1,4,2,3,6,5,8,7,删除偶数后,a所指数组中的数据为:9,1,3,5,7,返回值为5。请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果

int fun(int a[], int n)
{ 
    int i, j;
    j=0;
    for (i=0; i<n; i++)
    if (a[i]%2== _________ )
    {
        a[j]=a[i];   
        _________;
    }
    return _________;
}
  • A 0 j++ j
  • B 1 j++ j+1
  • C 0 j++ j+1
  • D 1 j++ j
答案:D
💡

解析:

代码实现的思路应该是arr[i]是奇数的时候要存储起来,所以第一个空是1,最开始j是0,每次找到一个奇数就存储到arr[j]的位置,那接下里j需要+1,所以得第二个空是j++,当循环停止的时候,j其实就是奇数的个数。所以最后返回j,第三个空是j。所以选D。

编程题

寻找奇数

题目链接:寻找奇数_牛客题霸_牛客网 (nowcoder.com)

描述
现在有一个长度为 n 的正整数序列,其中只有一种数值出现了奇数次,其他数值均出现偶数次,请你找出那个出现奇数次的数值。

数据范围: 1≤ n2\times10^6
输入描述:
第一行:一个整数n,表示序列的长度。第二行:n个正整数ai,两个数中间以空格隔开。
输出描述:
一个数,即在序列中唯一出现奇数次的数值。

思路解析:

本题注意到题目说出现奇数次的数值只有一个,其余数值均出现偶数次,可以考虑对数组整体进行异或

参考代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int num = 0;
    int ret = 0;
    scanf("%d",&num);
    int* data = (int*)malloc(sizeof(int)*num);
    for (int i = 0; i < num; i++) {
        scanf("%d", &data[i]);
        ret ^= data[i];
    }
    printf("%d",ret);
    return 0;
}

寻找峰值

题目链接:寻找峰值_牛客题霸_牛客网 (nowcoder.com)

描述
给定一个长度为 n的数组 nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。
1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
2.假设 nums[-1] = nums[n] = −∞
3.对于所有有效的 i 都有 nums[i] != nums[i + 1]
4.你可以使用O(logN)的时间复杂度实现此问题吗?

数据范围:
1≤ nums. length2\times10^5
(-2)^{31}<= nums[ i]<= 2^{31}-1

思路解析:

本题可以采用暴力求解找到峰值,但是题目规定使用O(logN)的时间复杂度,而暴力求解的时间复杂度为O(N),所以考虑采用二分查找的思想或者递归

首先考虑递归思想,在递归思想中,使用两个指针leftright分别控制左区间和右区间,以每一个区间的中间位置为界限将数组数值分为两部分,当leftright指针同时指向同一个位置时递归结束返回当前下标,当递归结束返回后比较两个下标对应数值的大小,返回较大值的下标,具体过程如下:(当前区间为[left, mid][mid + 1, right]

需要注意的是,分割后的区间不可以是[left, mid - 1][mid, right],因为会出现无穷递归,具体原因如下:

第二个是二分查找的思想,具体思路如下:

需要注意的是,使用二分查找思想需要判断当峰值出现在第一个元素和最后一个元素的位置

参考代码

二分查找思想

int findPeakElement(int* nums, int numsLen) {
    if(numsLen == 1 || nums[0] > nums[1])
    {
        return 0;
    }
    if(nums[numsLen - 1] > nums[numsLen - 2])
    {
        return numsLen - 1;
    }
    int left = 0;
    int  right = numsLen - 1;
    while (left < right) {
        int mid = (left + right) / 2;
        if(nums[mid] > nums[mid + 1])
        {
            right = mid;
        }
        else {
            left = mid + 1;
        }
    }
    return right;
}

递归思想

int _findPeakElement(int* nums, int left, int right) {
    if (left >= right) {
        return left;
    }
    int mid = (left + right) / 2;
    int leftSummit = _findPeakElement(nums, left, mid);
    int rightSummit = _findPeakElement(nums, mid + 1, right);

    return nums[leftSummit] > nums[rightSummit] ? leftSummit : rightSummit;
}
int findPeakElement(int* nums, int numsLen) {
    int ret = _findPeakElement(nums, 0, numsLen - 1);
    return ret;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1535969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎样在一台电脑安装多个版本的JDK并切换使用?一篇文章教会你所有细节

目录 1. 下载安装JDK版本 2. 配置环境变量 2. 1 配置环境变量的步骤 2.2 需要注意的细节点 2.3 JDK8&#xff0c;11&#xff0c;17版本切换测试 1. 下载安装JDK版本 a. JDK8 下载链接&#xff1a; Java Downloads | Oraclehttps://www.oracle.com/java/technologies/dow…

蓝桥杯刷题(十三)

1.煤球数目 代码 cnt ans 0 start 1 a [] while cnt<100:ansstartstart 1t ansstartcnt1a.append(ans) print(sum(a))2.奖券数目 代码 def f(x)->bool:while x:if x%104:return Falsex//10return True ans 0 for i in range(10000,100000):if f(i):ans1 print(a…

土地利用的时序建模

1、LULC 模型的现状 最近的土地利用和土地覆盖 (LULC) 建模进展来自两种方法。 在一种方法中&#xff0c;现有模型适用于 LULC&#xff0c;而在另一种方法中&#xff0c;模型架构是针对 LULC 明确设计的。 随着大型基础模型的兴起&#xff0c;人工智能和深度学习取得了重大进…

广告增量实时索引构建实践

本期作者 1.前言 在广告检索系统中&#xff0c;增量索引&#xff08;实时索引&#xff09;是一类常见的技术&#xff0c;用于使广告信息的变更及时生效。其中一种主要的思路即由检索系统消费广告更新数据流&#xff0c;实时更新内存索引&#xff0c;对此行业中已有很多优秀方案…

Linux: 线程安全

Linux 线程共享了进程的资源(地址空间, 页表等), 多个线程同时访问同一个资源就可能产生问题:数据竞争 临界资源: 多个线程共享的资源临界区: 访问临界资源的区域互斥: 任何时刻, 只有一个执行流能进入临界区同步: 以一定顺序访问临界资源原子性: 要么完成, 玩么未完成 锁 死…

【Leetcode每日一题】 递归 - Pow(x, n)(难度⭐⭐)(40)

1. 题目解析 题目链接&#xff1a;50. Pow(x, n) 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 在这个算法中&#xff0c;递归函数的任务是求出 x 的 n 次方。那么&#xff0c;这个函数是怎么工作的呢&#xff1f;它…

Linux_开发工具_yum_vim_gcc/g++_gdb_make/makefile_进度条_git_2

文章目录 一、Linux软件包管理器yum1. centos7 中安装软件方式2.安装&#xff0c;卸载&#xff0c;查看3.yum源4.安装lrzsz5.安装扩展源 二、Linux编辑器-vim1.安装vim2.vim的三种模式3.命令模式-文本批量化操作4.vim配置 三、Linux编译器-gcc/g使用1.安装2.gcc如何完成1、 预处…

安全工具介绍 SCNR/Arachni

关于SCNR 原来叫Arachni 是开源的&#xff0c;现在是SCNR&#xff0c;商用工具了 可试用一个月 Arachni Web Application Security Scanner Framework 看名字就知道了&#xff0c;针对web app 的安全工具&#xff0c;DASTIAST吧 安装 安装之前先 sudo apt-get update sudo…

qt5-入门-标签页部件QTabWidget-1

参考&#xff1a; C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt5.12 目录 效果实现Qt Designer操作代码addStretch()解释 效果 首页有三个按钮和最近文件列表。 拖动窗口&#xff0c;按钮和文件列表仍然处…

【算法与数据结构】总结

目录 引言 一、线性数据结构 1. 1 数组&#xff08;Array&#xff09; 1.2 链表&#xff08;Linked List&#xff09; 1.3 栈&#xff08;Stack&#xff09; 1.4 队列&#xff08;Queue&#xff09; 二、图形数据结构 2.1 深度优先搜索&#xff08;DFS&#xff09;&…

谈谈我对 AIGC 趋势下软件工程重塑的理解

作者&#xff1a;陈鑫 今天给大家带来的话题是 AIGC 趋势下的软件工程重塑。今天这个话题主要分为以下四大部分。 第一部分是 AI 是否已经成为软件研发的必选项&#xff1b;第二部分是 AI 对于软件研发的挑战及智能化机会&#xff0c;第三部分是企业落地软件研发智能化的策略…

VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准

文章目录 VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准总结摘要介绍相关工作单视角指静脉识别多视角指静脉识别Transformer 数据库基本信息 方法总体结构静脉掩膜生成VPC编码器视角内相关性的提取视角间相关关系提取输出融合IFFN近邻感知模块(NPM) patch嵌…

使用jscpd对比重复代码

背景 检查项目中重复的代码&#xff0c;或者代码片段 jscpd 两个文件对比 Jscpd 是一个用于检测代码复制和粘贴的工具&#xff0c;它可以比较两个文件并报告相似性的百分比。 以下是如何使用 Jscpd 来比较两个文件的示例&#xff1a; 首先&#xff0c;确保你已经安装了 Nod…

数据库系统概论-第16章 数据仓库与联机分析处理技术

概念性的介绍&#xff0c;一略而过&#xff0c;不重要。 16.1 数据仓库技术 16.2 联机分析处理技术 16.3 数据挖掘技术 16.4 大数据时代的新型数据仓库 16.5 小结

大数据信用报告查询:三种查询方式揭秘,哪种更适合你?

了解大数据信用与人行信用的区别对于理解个人信用状况至关重要。本文将探讨大数据信用报告的查询方法&#xff0c;评估不同方式的优劣&#xff0c;并给出建议。 大数据信用报告的查询途径 1. 二维码分享查询 通过搜索引擎找到的相关文章可能会包含查询二维码。这类方式通常只提…

FMEA常见误区与能力提升方法——FMEA软件

免费试用FMEA软件-免费版-SunFMEA 新版FMEA&#xff08;故障模式与影响分析&#xff09;作为一种重要的质量管理工具&#xff0c;被广泛应用于产品设计、生产和服务等领域。然而&#xff0c;在实际应用中&#xff0c;许多组织和个人常常陷入一些误区&#xff0c;导致FMEA的效果…

浅谈Javascript虚拟列表(virtaul list)改造成虚拟表格(virtaul table)的技术

前端加载百万条数据列表&#xff0c;如果采用真实的DOM插入100万个div&#xff08;或li&#xff09;标签&#xff0c;肯定是非常卡顿的。这就不得不使用虚拟列表技术方案&#xff0c;但是虚拟列表技术方案网上有很详细的实现方法&#xff0c;今天我就来谈谈根据网上的方案&…

【软考高项】十六、信息系统工程之安全工程

1、基础概念 定义&#xff1a;建造一个信息安全系统&#xff0c;它是整个信息系统工程的一部分&#xff0c;而且最好是与业务应用信息系统工程同步进行&#xff0c;主要围绕“信息安全”内容 信息安全系统三维空间&#xff1a; 包括安全机制、网络参考模型和安全服务 X轴是…

23 OpenCV 直方图比较

文章目录 直方图比较的目的相关性计算 (CV_COMP_CORREL)卡方计算 (CV_COMP_CHISQR)十字计算(CV_COMP_INTERSECT)巴氏距离计算 (CV_COMP_BHATTACHARYYA )compareHist 直方图比较算子示例 直方图比较的目的 直方图比较的目的是衡量两幅图像之间的相似度或差异度。通过计算图像的颜…

如何在 Windows 中恢复永久删除的文件

即使您从电脑或笔记本电脑中永久删除文件或文档&#xff0c;您也可以轻松恢复它们。因此&#xff0c;在本文的帮助下&#xff0c;我们将了解一些轻松恢复丢失数据的最佳和最值得信赖的方法。 生活中&#xff0c;难免会发生错误。这就是我们作为个人学习和成长的方式。这些错误…