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

news2024/11/16 11:38:51

一、力扣题目

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.coloradmin.cn/o/1688389.html

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

相关文章

Java面试真题日常练习

题目&#xff1a;反转字符串 描述&#xff1a;编写一个函数&#xff0c;输入一个字符串&#xff0c;将其反转并返回结果。 解题思路&#xff1a;可以使用两个指针&#xff0c;一个指向字符串的开头&#xff0c;一个指向字符串的末尾&#xff0c;然后不断交换两个指针所指的字符…

[AI Google] 10个即将到来的Android生态系统更新

新的体验带来了更强的防盗保护、手表电池寿命优化&#xff0c;以及对电视、汽车等的娱乐功能改进。 昨天&#xff0c;我们分享了Android如何以人工智能为核心重新构想智能手机。今天&#xff0c;我们推出了Android 15的第二个测试版&#xff0c;并分享了更多我们改进操作系统的…

Python代码注释的艺术与智慧

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;注释的必要性 二、注释的误区&#xff1a;不是越多越好 过度注释的问题…

jetcache缓存

1 介绍 是阿里的双极缓存&#xff0c;jvm-->redis-->数据库 文档&#xff1a;jetcache/docs/CN at master alibaba/jetcache GitHub 2 注意事项 使用的实体类一定实现序列化接口定时刷新注解&#xff0c;慎用 它会为每一个key创建一个定时器 &#xff1a;场景为&…

k8s节点亲和性配置

在Kubernetes中&#xff0c;你可以使用节点亲和性&#xff08;Node Affinity&#xff09;来控制Pod调度到特定的节点上。节点亲和性是通过Pod的spec.affinity.nodeAffinity属性来设置的。 以下是一个配置节点亲和性的YAML示例&#xff1a; apiVersion: v1 kind: Pod metadata…

YOLOv8原理详解

Yolov8是2023年1月份开源的。与yolov5一样&#xff0c;支持目标检测、分类、分割任务。 Yolov8主要改进之处有以下几个方面&#xff1a; Backbone&#xff1a;依旧采用的CSP的思想&#xff0c;不过将Yolov5中的C3模块替换为C2F模块&#xff0c;进一步降低了参数量&#xff0c…

为什么越来越多的服装连锁门店收银选web收银系统

如今&#xff0c;随着时尚产业的快速发展&#xff0c;服装连锁门店在管理上面临着越来越多的挑战。其中&#xff0c;收银系统作为零售店铺重要的管理工具&#xff0c;选择适合的收银系统对于提高门店管理效率和顾客体验至关重要。本文将探讨为什么服装连锁门店应选择Web收银系统…

kafka监控配置和告警配置——筑梦之路

kafka_exporter项目地址&#xff1a;https://github.com/danielqsj/kafka_exporter docker-compose部署kafka_exporter # docker-compose部署多个kafka_exporter&#xff0c;每个exporter对接一个kafka# cat docker-compose.ymlversion: 3.1 services:kafka-exporter-opslogs…

Android ART 虚拟机简析

源码基于&#xff1a;Android U 1. prop 名称选项名称heap 变量名称功能 dalvik.vm.heapstartsize MemoryInitialSize initial_heap_size_ 虚拟机在启动时&#xff0c;向系统申请的起始内存 dalvik.vm.heapgrowthlimit HeapGrowthLimit growth_limit_ 应用可使用的 max…

GetWay

SpringCloud - Spring Cloud 之 Gateway网关&#xff0c;Route路由&#xff0c;Predicate 谓词/断言&#xff0c;Filter 过滤器&#xff08;十三&#xff09;_spring.cloud.gateway.routes-CSDN博客 官网&#xff1a;Spring Cloud Gateway 工作原理&#xff1a;Spring Cloud G…

DeepDriving | CUDA编程-03:线程层级

本文来源公众号“DeepDriving”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;CUDA编程-03:线程层级 DeepDriving | CUDA编程-01&#xff1a; 搭建CUDA编程环境-CSDN博客 DeepDriving | CUDA编程-02&#xff1a; 初识CUDA编程-C…

操作系统总结3

目录 2.3.3 进程互斥的硬件的实现方法 &#xff08;1&#xff09;知识总览 &#xff08;2&#xff09;中断的屏蔽方法 &#xff08;3&#xff09;TestAndSet指令 &#xff08;4&#xff09;Swap指令 总结 2.3.4 信号量机制 &#xff08;1&#xff09;知识总览 &#x…

IO游戏设计思路

1、TCP ,UDP ,KCP ,QUIC TCP 协议最常用的协议 UDP协议非常规的协议&#xff0c;因为需要在线广播&#xff0c;貌似运营商会有一些影响 KCP 基于UDP的协议&#xff0c;GitHub - l42111996/java-Kcp: 基于java的netty实现的可靠udp网络库(kcp算法)&#xff0c;包含fec实现&am…

50.WEB渗透测试-信息收集-CDN识别绕过(3)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;49.WEB渗透测试-信息收集-CDN识别绕过&#xff08;2&#xff09; 关于cdn的识别方法内容…

智享无人直播系统(三代)融合AI智能互动,成就无人直播行业的新巨星!

随着直播行业的不断发展&#xff0c;智享直播&#xff08;三代&#xff09;作为首家自主研发的智能AI直播软件引领了行业的新潮流。相比市场上的其他同类软件&#xff0c;我们的软件通过创新的功能实现了直播间的AI智能互动&#xff0c;提供了丰富而个性化的直播体验。最重要的…

坚守互联网底层逻辑,搜狐走向长期主义的next level

2024年以来&#xff0c;随着我国经济回升向好态势进一步巩固增强&#xff0c;网络内容供给不断丰富&#xff0c;新型消费持续活跃&#xff0c;互联网板块整体估值向预期进行修正。因此&#xff0c;中概互联网指数ETF&#xff08;KWEB&#xff09;一转颓势&#xff0c;截至5月21…

拼多多:电商卷王

618大促将至&#xff0c;你还在天天算怎么用券吗&#xff1f;各电商卷来卷去&#xff0c;但可能都卷不过“天天618”的——拼多多。 5月22日&#xff0c;拼多多公布Q1财报&#xff0c; 营收同比增长131%至868.1亿人民币&#xff0c;调整后净利润同比增长202%至306.0亿元人民币…

Vue从入门到实战Day11

一、为什么要学Vue3 Vue3官网&#xff1a;简介 | Vue.js 1. Vue3的优势 2. Vue2选项式API vs Vue3组合式API 示例&#xff1a; 二、create-vue搭建Vue3项目 1. 认识create-vue create-vue是Vue官方新的脚手架工具&#xff0c;底层切换到了vite(下一代构建工具)&#xff0c;为…

【Vue2.x】props技术详解

1.什么是prop&#xff1f; 定义&#xff1a;组件标签上注册的一些自定义属性作用&#xff1a;向子组件传递数据特点 可以传递任意数量的prop可以传递任意类型的prop 2.prop校验 为了避免乱传数据&#xff0c;需要进行校验 完整写法 将之前props数组的写法&#xff0c;改为对象…

【搜索】BFS

#include <iostream> #include <cstring> #include <queue>using namespace std;const int N 110;typedef pair<int, int> PII;int n, m; int g[N][N], d[N][N];//存放地图//存每一个点到起点的距离int bfs() {queue< PII > q;q.push({0, 0});m…