C语言——小知识和小细节18

一、力扣题目

1、题目本体

2、题解

本题目我们使用异或分组的方法来解决。可以在我之前的文章《C语言——操作符CSDN博客》中看一下异或的特点。

由于异或的运算规则为相同为0,不同为1,而且是在二进制补码上进行操作的,我们可以发现的一个特点就是相同的数字异或的结果是0,利用这一点,我们好像就对上面的题目有了些许想法。

对于整个数组,只有两个出现一次的数字,其他的数字都是出现两次的,所以们可以发现,如果我们将数组所有的元素都异或起来,结果就是两个只出现一次的两个数字异或起来的结果。就像下面:

    int res = 0;int i = 0;for (i = 0; i < numsSize; i++) {res ^= nums[i];}

然后我们得到的这个res就是可以反映这两个只出现一次的数字的不同的位的,下面举个例子:

假设两个只出现一次的数字是 5 和 6,它们的二进制为101和110,异或后得到的结果的二进制为011。然后我们得到这个结果的目的就是将这两个不同的数字分开,可以发现结果中为 1 的位,也是这两个数字的不同的位,我们可以直接取到结果中第一个为1的位,通过这个位来将两个数分在不同组中,然后分别将两个组异或起来,就可已得到这两个数字。

3、代码

int* singleNumber(int* nums, int numsSize, int* returnSize) {int res = 0;int i = 0;for (i = 0; i < numsSize; i++) {res ^= nums[i];}int pos = 0;for (pos = 0; pos < 32; pos++) {if (((res >> pos) & 1) == 0) {break;}}int num1 = 0;int num2 = 0;for (i = 0; i < numsSize; i++) {if (((nums[i] >> pos)& 1) == 0) {num1 ^= nums[i];}else {num2 ^= nums[i];}}int* ans = (int*)malloc(2 * sizeof(int));ans[0] = type1;ans[1] = type2;*returnSize = 2;return ans;
}

4、解释

    for (i = 0; i < numsSize; i++) {res ^= nums[i];}

将数组中所有元素异或起来,得到 res 。

    for (pos = 0; pos < 32; pos++) {if (((res >> pos) & 1) == 0) {break;}}

用来找到 res 中第一个为1的位,然后使用 pos 变量来保存这个位是第几位,以便后面使用。

    int num1 = 0;int num2 = 0;for (i = 0; i < numsSize; i++) {if (((nums[i] >> pos)& 1) == 0) {num1 ^= nums[i];}else {num2 ^= nums[i];}}

这一步完成分组和分别将两个组的元素都异或起来,两步合在了一起。

    if (((nums[i] >> pos)& 1) == 0) {num1 ^= nums[i];}

如果数组中的元素的 pos 位也为 1 的话就分一组,然后依次异或起来,这时那两个只出现一次的数字已经被分开,这里只有其中之一。

    else {num2 ^= nums[i];}

如果数组中的元素的 pos 位0为 0 的话就分一组,然后依次异或起来,0,这里只有其中另一。

这样的活,其他相同的数字被分到哪一组都无所谓,它们两个一对会被分到一组,因为两个相同的数字的同一位是相同的。这样异或起来,最后,num1 和 num2 中就剩下那两个只出现一次的数字了。

二、模拟实现atoi函数

1、atoi函数介绍

在C语言中,atoi(ASCII to Integer)是一个标准库函数,用于将表示整数的字符串转换为其对应的整数值。该函数定义在stdlib.h头文件中。

函数原型

int atoi(const char *str);

参数

str:指向一个以空字符('\0')结尾的字符串,该字符串表示一个整数。

参数

返回转换后的整数值。
如果字符串中不包含合法的整数,atoi的行为未定义,可能返回0或其他值。

2、模拟实现

#include <stdio.h>
#include <limits.h>int my_atoi(const char* str) {const char* string = str;while (*string == ' ') {//跳过前置空格string++;}int flag = 0;if (*string == '-') {//判断数字正负flag = -1;string++;}else if (*string == '+') {flag = 1;string++;}long long retValue = 0;while (*string) {//计算数字本体if (*string <= '9' && *string >= '0') {retValue = retValue * 10 + (long long)((*string - '0') * flag);if (retValue > INT_MAX || retValue < INT_MIN) {//判断是否越界return 0;}}else {return (int)retValue;}string++;}return (int)retValue;
}int main() {char str[] = "    -123878";int res = my_atoi(str);printf("%d", res);return 0;
}

运行结果:

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

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

相关文章

c++|多态

c|多态 1 多态的概念2 多态的定义及其实现2.1 满足多态的条件2.2 虚函数2.3 虚函数的重写2.4 析构函数适合加virtural吗2.4 C11 override 和 final2.5 三个概念的对比 3 多态的原理4 抽象类4.1 概念4.2 纯虚函数 1 多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是…

【再探】设计模式—代理模式

代理是指授权代理人在一定范围内代表其向第三方进行处理有关事务。 1 代理模式 需求&#xff1a;1&#xff09;将业务代码与非业务代码分离&#xff0c;在不改变代码结构的基础上&#xff0c;为其添加新的功能。2&#xff09;为系统中的某些操作做同一处理&#xff0c;例如进…

[实例] Unity Shader 逐像素漫反射与半兰伯特光照

漫反射光照是Unity中最基本最简单的光照模型&#xff0c;本篇将会介绍在片元着色器中实现反射效果&#xff0c;并会采用半兰伯特光照技术对其进行改进。 1. 逐顶点光照与逐像素光照 在Unity Shader中&#xff0c;我们可以有两个地方可以用来计算光照&#xff1a;在顶点着色器…

z3-加法器实验

补码器加减法&#xff0c;运算方法简介 我们要知道什么是补码的加法&#xff0c;我们为什么要用补码的加法&#xff1f; 补码的加法其实就是将两个补码形式的二进制数字直接相加&#xff0c;处理的时候忽略超出固定位数的进位。补码的加法运算和无符号二进制数的加法操作一样&…

【最新区块链论文录用资讯】CCF A — SP 2024 共17篇

Conference&#xff1a;45th IEEE Symposium onSecurity and Privacy CCF level&#xff1a;CCF A Categories&#xff1a;网络与信息安全 Year&#xff1a;2024 Num&#xff1a;17 Efficient Zero-Knowledge Arguments For Paillier Cryptosystem Paillier 加密系统的有效…

基于python的网页自动刷新工具

1.下载webdriver https://msedgewebdriverstorage.z22.web.core.windows.net/?prefix122.0.2365.59/下载Edge的浏览器驱动 2.安装selenium pip install selenium4.11.1 3.写代码 # -*- coding: utf-8 -*- import tkinter as tk from tkinter import messagebox import thr…

【halcon】set_part 实现平移和缩放 彻悟版

背景 之前写了一篇关于set_part 的文章 &#xff0c;确实也实现了平移和缩放。平移是对的&#xff0c;但是缩放其实有畸变。这个问题一直都困扰着我&#xff0c;知道昨天连续测试了好几个小时&#xff0c;直到晚上11点终于完美解决。 坐标和高宽 坐标 再讲set_part 之前&am…

免费撸gpt-4o和各种大模型实用经验分享

项目 Github: https://github.com/MartialBE/one-api 先贴两张图&#xff1a; 说明 免费撸AI大模型,各位可以对照下面我给出的大模型记录表来填&#xff0c;key需要自己去拿&#xff0c;国内都需要手机号验证&#xff0c;如果你不介意。另外我在自己的博客放出免费API给大家…

模型评价指标笔记:混淆矩阵+F1+PR曲线+mAP

评价指标 二分类评价指标 混淆矩阵 TP: 正确预测为了正样本&#xff0c;原来也是正样本 FN: 错误的预测为负样本&#xff0c;原来是正样本 (漏报&#xff0c;没有找到正确匹配的数目) FP: 错误的预测为正样本&#xff0c;原来是负样本 (误报&#xff0c;没有的匹配不正确) TN…

CIM模型

CIM 是 Esri 制图信息模型。 它是一个地图内容规范,用于记录在保存、读取、引用或打开时如何永久保留描述不同项目组件的信息。 该规范以 JSON 表示,适用于 ArcGIS 应用程序和 API 中的地图、场景、布局、图层、符号和样式。 CIM 不仅限于制图设置。 要了解属性的组织方式以及…

【Tools】SpringBoot工程中,对于时间属性从后端返回到前端的格式问题

Catalog 时间属性格式问题一、需求二、怎么使用 时间属性格式问题 一、需求 对于表中时间字段&#xff0c;后端创建对应的实体类的时间属性需要设定格式&#xff08;默认的格式不方便阅读&#xff09;&#xff0c;再返回给前端。 二、怎么使用 导入jackson相关的坐标&#x…

Vue.js - Vue 的安装 以及 常用的 Vue 指令 【0基础向 Vue 基础学习】

文章目录 Vue 快速上手1、Vue.js 官网 & Vue.js 的获取2、创建 Vue 实例&#xff0c;初始化渲染3、插值表达式 安装 Vue 开发者工具&#xff1a;装插件调试 Vue 应用Vue 指令1、v-show 指令2、v-if3、v-else & v-else-if4、v-onv-on 调用传参 5、v-bindv-bind 对于样式…

【算法】前缀和算法——和为k的子数组之和

题解&#xff1a;和为k的子数组之和(前缀和算法) 目录 1.题目2.题解思路2.1前缀和 哈希表&#xff0c;算法步骤&#xff1a;2.2细节如下&#xff1a;2.3参考代码&#xff1a; 3.总结及思考 1.题目 题目链接&#xff1a;LINK 2.题解思路 暴力求解自然不用多说&#xff0c;时…

【SQL】外连接 LEFT JOIN

目录 一.内连接与外连接 1.内连接&#xff08;inner join&#xff09; 2.外连接&#xff08;outer join&#xff09; 二.两表连接 1.我们先来试试看内连接&#xff1a; 2.我们再来试试外连接 三.单表外连接 四.总结 一.内连接与外连接 先得介绍内连接和外连接两个概念&…

第199题|关于函数的周期性问题|函数强化训练(六)|武忠祥老师每日一题 5月24日

解题思路&#xff1a;解这道题我们要用到下面这个结论 f(x)连续&#xff0c;以T为周期时&#xff0c;原函数以T为周期的充分必要条件是&#xff1a; (A) sin x显然是以π为周期的&#xff0c;我们可以看到并不等于0,根据结论&#xff0c;A的原函数显然不是周期函数。 (B) 的…

你以为的私域是真正的私域嘛??你的私域流量真的属于你嘛?

大家好 我是一个软件开发公司的产品经理 专注私域电商行业7年有余 您的私域流量是真正的属于你自己嘛&#xff1f; 私域的定义 私域的界定&#xff1a;一个互联网私有数据&#xff08;资产&#xff09;积蓄的载体。这个载体的数据权益私有&#xff0c;且具备用户规则制定权…

Mysql 备份恢复 mysqldump与xtrabackup备份

1.1 备份的原因 备份是数据安全的最后一道防线&#xff0c;对于任何数据丢失的场景&#xff0c;备份虽然不一定能恢复百分之百的数据 (取决于备份周期)&#xff0c;但至少能将损失降到最低。衡量备份恢复有两个重要的指标&#xff1a;恢复点目标(RPO) 和恢复时间目标(RTO)&…

数据库常用命令(1)

DML 1.添加数据&#xff08;insert into&#xff09; insert into 表名 values (值1&#xff0c;值2....); 表示成功运行&#xff1a; 2.修改数据&#xff08;update&#xff09; update 表名 set 字段名1值1&#xff0c;字段名2值2.....【where条件】 3.删除数据&#xff0…

元年科技数据智能研发部负责人张亚东受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 北京元年科技股份有限公司数据智能研发部负责人张亚东先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“大模型时代&#xff0c;AI创新型工具提升项目管理效率”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&a…

jmeter之HTTP请求和查看结果树

一、HTTP请求作用&#xff1a; 可以发送post或get请求等请求可以向服务器发送参数或消息体数据可以进行文件上传 HTTP请求&#xff1a;是线程组内的取样器最常用的的一个原件 二、查看界面 添加一个HTTP请求&#xff1a;选择线程组–添加–取样器–HTTP请求 默认界面 名称和…