C语言基础练习——Day10

目录

选择题

编程题

不用加减乘除做加法

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


选择题

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://xiahunao.cn/news/2871582.html

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

相关文章

别急,先了解一下什么是REST API吧

1、先想一想Rest API的用途和场景 Rest API的常用场景&#xff1a;前后端分离&#xff0c;前端可多样化&#xff0c;还有与其他系统集成&#xff1a;RESTful API 可以与其他系统进行集成&#xff0c;例如第三方登录、支付和社交媒体平台等。 现在我们知道了如何使用 servlet …

redis 常见的异常

目录 一、缓存穿透 1、概念 解决方案 &#xff08;1&#xff09;布隆过滤器 (2)、缓存空对象 二、缓存雪崩 1、概念 解决方案 &#xff08;1&#xff09;redis高可用 &#xff08;2&#xff09;限流降级 &#xff08;3&#xff09;数据预热 一、缓存穿透 1、概念 缓…

仰卧起坐计数,YOLOV8POSE

仰卧起坐计数&#xff0c;YOLOV8POSE 通过计算膝盖、腰部、肩部的夹角&#xff0c;计算仰卧起坐的次数

分数相加减(C语言)

一、流程图&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int fenmu 2;int result 1;int fuhao 1;//执行循环&#xff1b;while (fenmu < 100){//运算&#xff1b;fuhao (-1…

汽车电子与软件架构概述

汽车电子与软件架构概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎,出门靠自己…

Sentinel篇:线程隔离和熔断降级

书接上回&#xff1a;微服务&#xff1a;Sentinel篇 3. 隔离和降级 限流是一种预防措施&#xff0c;虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还会因为其它原因而故障。 而要将这些故障控制在一定范围&#xff0c;避免雪崩&#xff0c;就要靠线程隔离…

MySQL数据库实现增删改查基础操作

准备工作 安装mysql8.0 (安装时一定要记住用户名和密码)安装数据库可视化视图工具Navicat 请注意⚠️⚠️⚠️⚠️ a. 编程类所有软件不要安装在中文目录下 b. Navicat破解版下载安装教程&#xff1a;&#xff08;由于文章审核提示版权问题&#xff0c;链接不方便给出&#xff…

Docker 哲学 - 容器操作

容器&#xff1a; 创建 停止 删除 强制删除&#xff08;正在运行&#xff09; run stop rm rm -f 列出本地容器&#xff1a; docker ps / docker container ls 镜像&#xff1a; search pull run &#xff1a; …

Orbit 使用指南 03 | 与刚体交互 | Isaac Sim | Omniverse

如是我闻&#xff1a; “在之前的指南中&#xff0c;我们讨论了独立脚本&#xff08; standalone script&#xff09;的基本工作原理以及如何在模拟器中生成不同的对象&#xff08;prims&#xff09;。在指南03中&#xff0c;我们将展示如何创建并与刚体进行交互。为此&#xf…

2024 年(第 12 届)“泰迪杯”数据挖掘挑战赛—— C 题:竞赛论文的辅助自动评阅完整思路与源代码分享

一、问题背景 近年来我国各领域各层次学科竞赛百花齐放&#xff0c;层出不穷&#xff0c;学生参与度也越来越高。随着参赛队伍的增 加&#xff0c;评阅论文的工作量急剧增加&#xff0c;这对评阅论文的人力要求也越来越大。因此引入机器辅助评阅成为竞赛主办方的现实需求。 在…

【解读】保障软件供应链安全: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…

数据结构试卷第九套

1.时间复杂度 2.树&#xff0c;森林&#xff0c;二叉树的转换 2.1树转二叉树 给所有的兄弟节点之间加一条连线&#xff1b;去线&#xff0c;只保留当前根节点与第一个叶子节点的连线&#xff0c;删除它与其他节点之间的连线&#xff1b;然后根据左孩子右兄弟进行调整&#xf…

JavaScript slice()方法详解

在 JavaScript 中&#xff0c;slice() 是一个常用的数组方法&#xff0c;用于从现有数组中提取一部分元素&#xff0c;然后返回一个新的数组。它是一个非常有用的工具&#xff0c;可以帮助你在不改变原始数组的情况下操作数组的子集。本文将介绍 slice() 的基本概念、使用方法、…

算法第二十九天-最长公共子序列

最长公共子序列 题目要求 解题思路 求这两个数组或者字符串的最长公共子序列问题&#xff0c;肯定要用到动态规划。 首先区分两个概念&#xff1a;子序列可以是不连续的&#xff1b;子数组&#xff08;子字符串&#xff09;是需要连续的&#xff1b;另外&#xff0c;动态规划…

WorkPlus Meet局域网视频会议软件的领先解决方案

局域网视频会议软件在现代企业中发挥着重要的作用&#xff0c;而在众多选项中&#xff0c;为何选择WorkPlus Meet作为局域网视频会议软件&#xff1f; 选择局域网视频会议软件时需要考虑到企业的需求。WorkPlus Meet提供了稳定、高效的局域网视频会议功能&#xff0c;能够满足…

前端工程化(二)(精品、面试必备基础)(春招、秋招)

目录 什么是模块化?CommonJS规范和Node关系模块化的核心exports 导出 & require 导入模块加载(持续更新) 什么是模块化? 事实上模块化开发最终的目的是将程序划分成一个个小的结构&#xff1b; 这个结构中编写属于自己的逻辑代码&#xff0c;有自己的作用域&#xff0c;…

云服务器2核4G5M配置代表什么意思?

腾讯云服务器2核4G5M带宽配置是代表什么&#xff1f;代表2核CPU、4G内存、5M公网带宽&#xff0c;这是一款轻量应用服务器&#xff0c;系统盘为60GB SSD云硬盘&#xff0c;活动页面 txybk.com/go/txy 活动打开如下图&#xff1a; 腾讯云2核4G5M服务器 如上图所示&#xff0c;这…

汽车电子零部件(6):DMS/OMS、CMS

前言: 有一个部件过去不曾有,而如今有可能要标准化标配化,那就是Driver Monitoring System (DMS)驾驶员监控系统、Occupant Monitoring System (OMS)乘客监控系统和Camera Monitor System(CMS)摄像头监控系统。 汽车视觉技术的创新推动先进驾驶辅助系统的变革(ADAS),并…

Linux_基础指令(一)

目录 1、ls指令 1.1 ls -l 1.2 ls -a 1.3 ls -i 2、pwd指令 3、cd指令 3.1 路径的概念 3.1.1 绝对路径 3.1.2 相对路径 3.2 cd ~ 3.3 cd - 4、touch指令 5、mkdir指令 6、删除系列的指指令 6.1 rmdir 6.2 rm 7、man指令 8、cp指令 9、move指令 结…

Prometheus 轻量化部署和使用

文章目录 说明Prometheus简介Grafana简介prometheus和Grafana的关系环境准备&#xff08;docker&#xff09;docker安装时间时区问题&#xff08;我的代码中&#xff09;dockers镜像加速和服务器时区设置 数据库准备(mysql、redis)mysql配置redis配置 Prometheus、grafana下载和…