C语言基础练习——Day10

news2025/4/4 16:36:33

目录

选择题

编程题

不用加减乘除做加法

找到所有数组中消失的数字


选择题

1、求函数返回值,传入-1,则在64位机器上函数返回

int func(int x)
{
    int count = 0;
    while (x)
    {
        count++;
        x = x&(x - 1);//与运算
    }
    return count;
}
  • A 死循环
  • B 64
  • C 32
  • D 16
答案:C
💡

解析:

x=x&(x-1)这个表达式执行一次就会将x的2进制中最右边的1去掉,在x变成0之前,表达式能执行几次,就去掉几个1,所以这个代码实现了求一个有符号整数二进制补码中1的个数的功能,我们知道-1的补码是全1,而int类型4个字节32位,选C

2、读代码选结果

int count = 0;
int x = -1;
while(x)
{
    count++;
    x = x >> 1;
}
printf("%d",count);
  • A 1
  • B 2
  • C 32
  • D 死循环,没结果
答案:D
💡

解析:

此题一个关键,有符号数右移运算高位是补符号位的,负数的符号位是1,所以x永远不会变为0,是个死循环

3、下述赋值语句错误的是

  • A a = (b = (c = 2 , d = 3))
  • B i++
  • C a/b = 2
  • D a = a < a + 1
答案:C
💡

解析:

C选项中a/b是表达式,表达式计算的结果是一个值不能做左值

4、若有int w=1, x=2, y=3, z=4;则条件表达w < x ? w : y < z ? y : z的值是

  • A 1
  • B 2
  • C 3
  • D 4
答案:A
💡

解析:

w<x?w:(y<z?y:z)加个括号应该就好理解了w<x为真,返回w,即表达式的值为1

5、以下程序运行后的输出结果是

int main()
 {
     int a=1,b=2,m=0,n=0,k;
     k=(n=b<a)&&(m=a);
     printf("%d,%d\n",k,m);
     return 0;
 }
  • A 0,0
  • B 0,1
  • C 1,0
  • D 1,1
答案:A
💡

解析:

k=(n=b<a)&&(m=a);这部分的执行顺序如下:先执行n=b<a部分,其中,关系运算符优先级高于赋值运算符,所以先算b<a,得到0,n=0赋值运算的结果将作为括号内表达式的结果,即(n=b<a)&&(m=a)转换成(0)&&(m=a)&&运算前表达式为假,则后面的括号(m=a)不运算,m值还是0,最后,&&的结果是0,即k=0

编程题

不用加减乘除做加法

题目链接:不用加减乘除做加法_牛客题霸_牛客网 (nowcoder.com)

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

数据范围:两个数都满足−10≤ n≤1000
进阶:空间复杂度 O(1),时间复杂度 O(1)

思路解析:

在加法过程中,需要考虑到进位和不进位的情况,而&运算符的计算规则可以产生进位,两个数值相与后左移可以获得进位的位置,而和的值则由异或运算符^的计算规则实现,1^0 = 1(1 + 0 = 1), 1 ^ 1 = 0(1 + 1 = 2,配合&运算符的进位值相与10&(1^1) = 2),当不再产生进位时,代表加和已经完成,此时处理好和即可

参考代码

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param num1 int整型 
 * @param num2 int整型 
 * @return int整型
 */
int Add(int num1, int num2 ) {
    int sub = num1;//记录进位
    int sum = num2;//记录求和
    while (sub != 0) {
        int tmp = sub ^ sum;//计算除了进位的部分
        sub = (sum & sub) << 1;//获取进位
        sum = tmp;//更新sum为和
    }
    return sum;
}

找到所有数组中消失的数字

题目链接:448. 找到所有数组中消失的数字 - 力扣(LeetCode)

给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。

思路解析:

本题最直观的想法就是使用异或思想,但是考虑到消失的数字可能不止一个或者两个,此时异或思想不再可用

根据题目描述,数组中的数据为n个,而最大值也为n,可以利用这个特点使用哈希直接定址的思想来进行解决,最直接的办法就是创建一个和原数组大小相同的临时数组tmp,根据原数组中数据出现的次数对应tmp数组的下标位置的值+1,原数组遍历完成后,如果tmp数组中下标对应值为0的,则说明该下标为数组中消失的数字,具体思路如下:

由于额外开辟一个临时数组tmp,所以空间复杂度为O(N),考虑到题目的特点,数组中最大数值为n,而数组的长度也为n,则此时最后一个元素的下标为n - 1,此时可以考虑套用哈希直接定址的思路在原数组上直接标记,原数组的下标0- (n-1)充当原来的tmp数组的标记位置,具体思路如下:

参考代码:

/*
 * @lc app=leetcode.cn id=448 lang=c
 *
 * [448] 找到所有数组中消失的数字
 */

// @lc code=start
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int *findDisappearedNumbers(int *nums, int numsSize, int *returnSize)
{
    *returnSize = 0;
    int *ans = (int *)malloc(sizeof(int) * numsSize);

    // 计数排序的基本思路——哈希直接定址
    int range = numsSize + 1;
    int *tmp = (int *)calloc(range, sizeof(int));
    for (int i = 0; i < numsSize; i++)
    {
        tmp[nums[i]]++;
    }
    for (int i = 1; i < range; i++)
    {
        if (tmp[i] == 0)
        {
            ans[(*returnSize)++] = i;
        }
    }

    return ans;
}
// @lc code=end

思路优化,空间复杂度由O(N)降低到O(1)

/*
 * @lc app=leetcode.cn id=448 lang=c
 *
 * [448] 找到所有数组中消失的数字
 */

// @lc code=start
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int *findDisappearedNumbers(int *nums, int numsSize, int *returnSize)
{
    int *ans = (int *)malloc(sizeof(int) * numsSize);
    *returnSize = 0;
    for (int i = 0; i < numsSize; i++)
    {
        // 标记数组中的数值,没有被标记为负数的对应的下标+1即为缺失的数值
        // 当遇到已经为负的数值时,不再标记为负
        if (nums[abs(nums[i]) - 1] < 0)
        {
            continue;
        }
        nums[abs(nums[i]) - 1] *= (-1);
    }
    // 遍历数组找出非负值的下标
    for (int i = 0; i < numsSize; i++)
    {
        if (nums[i] > 0)
        {
            ans[(*returnSize)++] = i + 1;
        }
    }
    return ans;
}
// @lc code=end

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

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

相关文章

C# 打开文件对话框(OpenFileDialog)

OpenFileDialog&#xff1a;可以打开指定后缀名的文件&#xff0c;既能单个打开文件也能批量打开文件 /// <summary>/// 批量打开文档/// 引用&#xff1a;System.Window.Fomrs.OpenFileDialog/// </summary>public void OpenFile(){OpenFileDialog dialog new Op…

【解读】保障软件供应链安全:SBOM推荐实践指南(含指南获取链接)

2023年11底&#xff0c;美国NSA&#xff08;National Security Agency&#xff09;、CISA&#xff08;Cybersecurity and Infrastructure Security Agency&#xff09;等多个政府机构部门组成的ESF&#xff08;Enduring Security Framework&#xff0c;持久安全框架&#xff09…

力扣L15--- 67.二进制求和(JAVA版)-2024年3月17日

1.题目描述 2.知识点 注1&#xff1a; 二进制用 %2 /2 3.思路和例子 采用竖位相加的方法 4.代码实现 class Solution {public String addBinary(String a, String b) {StringBuilder sbnew StringBuilder();int ia.length()-1;int jb.length()-1;int jinwei0;int digit1,d…

龙芯新世界系统(安同AOCS OS)安装Cinnamon桌面最新版6.0.4

龙芯的新世界系统安同AOCS OS是十分优秀的操作系统&#xff0c;处于纯社区方式运行&#xff0c;她的各组件更新得很及时&#xff0c;很多组件都处于最新的状态&#xff0c;给我们安装使用最新的开源软件提供了很好的基础。由于本人一直使用Cinnamon桌面环境&#xff0c;各方面都…

C++初阶:类与对象(尾篇)

目录 1. 构造函数与初始化列表1.1 对象的创建与构造函数的初始化1.2 初始化列表及构造函数存在的意义1.3 explicit关键字与构造函数的类型转换 2. static成员变量与static成员函数2.1 static成员变量2.2 static成员函数 3. 日期类流插入操作符的重载与友元3.1 友元3.2 友元函数…

【OpenGL手册19】几何着色器

目录 一、说明 二、渲染管线的逻辑 三、几何着色器 四、使用几何着色器 五、造几个房子 六、几何着色器渲染爆破物体 一、说明 如果说用顶点和片段着色器干了什么&#xff0c;其实不多。加入几何着色器&#xff0c;能够加大渲染能力&#xff0c;简化数据结构&#xff0c;…

【Linux】对进程PCB的理解查看进程信息的方法

一、学习准备&#xff1a;对操作系统工作模式的理解 首先我们要清楚的是&#xff0c;操作系统是一个进行软硬件资源管理的软件。操作系统对下要管理好底层硬件。每一个硬件的生产产商都会给他们的产品提供对应的驱动程序&#xff0c;驱动程序是特定于某一硬件或系统设备的软件组…

参与者中心方案设计

参与者中心方案设计 ⼀、背景介绍 为适应客⼾多元化&#xff0c;随着业务发展&#xff0c;需要⽀持以平台为基础⽀持多租⼾企业⼊驻⽅式进⾏对外放。 1.1 需求来源 客⼾、产品 1.2 需求描述 ⽀持多租⼾ ⽀持客⼾⾃定义⻆⾊、菜单权限 ⽀持根据不同⻆⾊设置不同数据权限控…

备战蓝桥杯Day26 - 二叉搜索树查询和删除操作

一、查询 递归查询 寻找的值比根节点大&#xff0c;遍历右子树&#xff1b; 寻找的值比根节点小&#xff0c;遍历左子树。 def qurey(self, node, val):if not node: # 没有节点&#xff0c;返回空return Noneif node.data < val:return self.qurey(node.rchild, val)el…

Spring MVC 如何返回响应

上期我们讲请求的时候&#xff0c;每个方法返回的数据就是响应&#xff0c;我们也可以返回一个静态页面&#xff0c;设置响应的状态码&#xff0c;Header信息等。 1. 返回静态页面 我们先在项目的static文件夹下创建一个HTML文件作为我们返回的页面&#xff1a; <!DOCTYPE…

OLAP与数据仓库和数据湖

OLAP与数据仓库和数据湖 本文阐述了OLAP、数据仓库和数据湖方面的基础知识以及相关论文。同时记录了我如何通过ChatGPT以及类似产品&#xff08;通义千问、文心一言&#xff09;来学习知识的。通过这个过程让我对于用AI科技提升学习和工作效率有了实践经验和切身感受。 预热 …

粤嵌6818嵌入式开发入门教程

学习目标 1.了解嵌入式开发 2.开发环境的搭建 3.Linux操作系统的基本操作 一、了解嵌入式开发 以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软硬件可裁剪&#xff0c;适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 1.嵌入式可以干…

再见 Pandas,又一数据处理神器

cuDF介绍 cuDF是一个基于Apache Arrow列内存格式的Python GPU DataFrame库&#xff0c;用于加载、连接、聚合、过滤和其他数据操作。cuDF还提供了类似于pandas的API。 GitHub&#xff1a; https://github.com/rapidsai/cudf Documentation&#xff1a; https://docs.rapids.a…

基于springboot+vue的大学生就业需求分析系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

2.亿级积分数据分库分表:增量数据同步之代码双写,为什么没用Canal?

1.亿级积分数据分库分表&#xff1a;总体方案设计 上一篇博客中写了一下积分数据分库分表的总体方案设计&#xff0c;里面说了采用应用程序代码双写的方式实现的增量数据同步&#xff0c;本篇就对这一块进行一些细化的介绍&#xff0c;包括&#xff1a; 为什么不用Canal监听数…

WebServer -- 八股(终章)

&#x1f442; Honey Honey - 孙燕姿 - 单曲 - 网易云音乐 目录 &#x1f33c;触类旁通 &#x1f6a9;线程 && 进程 线程与进程的区别 多线程锁是什么 进程 / 线程 / 协程 的区别 线程切换时&#xff0c;需要切换的状态 &#x1f382;并发 && 并行 并…

一起玩儿3D打印机——03 Marlin固件的获取和安装环境的配置

摘要&#xff1a;本文介绍Marlin固件的获取和安装环境的配置 Marlin是一款开源软件&#xff0c;其主页为&#xff1a;https://marlinfw.org/&#xff0c;首页正中就是下载连接&#xff0c;如下图所示&#xff1a; 单击下面的“Download Marlin 2.1.2.2”按钮就会进入下载页面&a…

Transformer学习笔记(一)

一、预训练 1、图像领域的预训练 通过 ImageNet 数据集我们训练出一个模型 A由于 CNN 的浅层学到的特征通用性特别强&#xff0c;我们可以对模型 A 做出一部分改进得到模型 B&#xff08;两种方法&#xff09;&#xff1a; 冻结&#xff1a;浅层参数使用模型 A 的参数&#x…

postgres中的hook机制

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;14,13,12,11 文档用途 1.了解使用postgres中的hook机制&#xff0c;在不更改内核代码的前提下完成一些定制化需求&#xff1b; 2.从底层理解插…

Visual Studio 2022 出现:E1696无法打开 源 文件 “stdafx.h“;E0020未定义标识符 “_TCHAR“错误解决办法

今天在用自己电脑上的visual studio2022写并行计算实验报告时出现了这种错误&#xff0c;但我在机房电脑vs2010版本运行时没有任何问题&#xff0c;于是我在网上找了解决办法&#xff0c;现总结如下。 1.报错E1696无法打开 源 文件 "stdafx.h"&#xff0c;解决办法&a…