当前位置: 首页 > news >正文

位运算算法题

一.判断字符是否唯一

 法一:

        我们直接借助一个字符数组来模拟哈希表统计字符串即可,并且我们没有必要先将所有字符都放入字符数组中,边插入边判断,当我们要插入某个字符的时候,发现其已经出现了,此时必然重复,直接返回false。

        时间复杂度:O(n),最坏情况下只需要遍历一次字符串即可

        空间复杂度:O(1),我们只是用了固定的常数级的额外空间:26个char的字符数组

法二:

        因为字符串只包含26个小写字母。我们可以用一个int变量的26个bit位来依次表示26个小写字母。0表示没出现,1表示出现,如果遍历到那个字符,发现其对应的二进制位为1,表示该字符重复出现,返回false。

        我们首先定义一个int变量mark来记录字符的出现次数。接着我们遍历字符串,我们让字符a对应0位置,以此类推。遍历字母的时候,先判断对应位是0还是1( (x>>i) & 1 ),如果是1直接返回,如果是0,则将该位修改成1( x |= ( 1<< i ) )

        时间复杂度:O(n),最坏情况下只需要遍历一遍字符串即可

        空间复杂度:O(1),只使用了一个int变量来标记字母

细节:如果字符串的长度大于26,则该字符串一定存在重复字符。直接返回false。

// C++
// 法一:class Solution 
{
public:bool isUnique(string astr) {int hash[26] = {0};for(auto e : astr){if(hash[e-'a'] == 1) return false;else hash[e-'a'] = 1;}return true;}
};// 法二:
class Solution 
{
public:bool isUnique(string astr) {if(astr.size() > 26) return false;int mark = 0;for(auto e : astr){int index = e-'a';if(((mark >> index) & 1) == 0) mark |= (1<<index);else return false;}return true;}
};
# Python
# 法二:class Solution:def isUnique(self, astr: str) -> bool:if len(astr) > 26 :return Falsemark = 0for e in astr:index = ord(e) - ord('a')if ((mark >> index) & 1) == 1 :return False;else:mark |= (1<<index)return True

二.丢失的数字

 0~n这n+1个数中,有n个数放在了数组中,我们要找出那缺少的那个数

解法:

        我们借助异或运算符的性质:a^a = 0,a^0 = a,a^b^a = (a^a)^b.

        我们可以先将数组的元素都异或,然后在将0~n这n+1个数再异或,这样整个数据集就满足只有一个数出现了一次,其余都出现了两次。这样重复的数就可以通过异或操作变为0,最后剩下的数就是丢失。

        时间复杂度:O(n),我们只需要遍历两遍数组,即可得到异或结果

        空间复杂度:O(1),我们只是用了一个int变量来存储异或的结果。

// C++class Solution 
{
public:int missingNumber(vector<int>& nums) {int mark = 0;for(auto e : nums) mark ^= e;for(int i=0; i<=nums.size(); ++i) mark ^= i;return mark;}
};
# Pythonclass Solution:def missingNumber(self, nums: List[int]) -> int:mark = 0for i in nums:mark ^= ifor i in range(0,len(nums)+1):mark ^= ireturn mark

三.两整数之和

不使用加减运算符计算两个整数的和。如果笔试题遇到直接return x+y

解法:

         其实两整数相加的本质就是其对应的二进制位相加,相加无非就是进位与不进位两种情况。对于a、b来说,它们对应相加的二进制位无非下面四种情况:

        a          b

————————————————

        0    +    1    =    1

        1    +    0    =    1

        0    +    0    =    0

        1    +    1    =    0(2,需要进位:10)

        我们之间了解过,异或运算符就是无进位相加的结果,所以我们可以先计算出a+b的无进位相加的结果,然后再加上进位即可。

        那么怎么计算进位的结果呢?我们观察二进制位相加的可能性,只有11才会进位,所以我们可以借助&运算,只要有0,就不会进位,结果都是0,如果都是1,就需要进位结果就是1.所以我们就可以借助a&b来得到进位。但是我们进位是要进到前一位,所以我们还需要让a&b的结果左移一位。

        得到进位之后,我们在让a^b无进位相加上进位(a&b)<<1,这样就将这两部分加在了一起。但是这样相加之后,可能有出现了需要进位的情况,所以我们依旧得先进行无进位相加,接着求进位,将这两部分相加后重复该操作。知道进位为0.

 a      b

13 + 23

——————————————第一次

        00001101

        00010111

a^b 

        00011010

(a&b)<<1

        00001010

——————————————第二次

a = 00011010

b = 00001010

a^b

        00010000

(a&b)<<1

        00010100

——————————————第三次

a = 00010000

b = 00010100

a^b        

        00000100

(a&b)<<1

        00100000

——————————————第四次

a = 00000100

b = 00100000

a^b

        00100100

(a&b)<<1

        00000000

——————————————此时进位为0,结束循环,返回a^b

a^b = 00100100 = 36

// C++class Solution 
{
public:int getSum(int a, int b) {do{int tmp = a^b;b = (a&b)<<1;a = tmp;}while(b);return a;}
};

 四.只出现一次的数2

法一:

        我们可以借助哈希表来统计每个元素出现的次数,返回只出现了一次的元素即可

        时间复杂度:O(n),遍历一遍数组和一遍哈希表即可

        空间复杂度:O(k),k表示数组中不同元素的个数

法二: 

        我们可以依次求出最终结果的每一个二进制位的数是0还是1。具体的求答案的第i位二进制(i从0开始),对于非答案元素来说,它们都出现了三次,所以第i位的二进制要么是三个0,要么是三个1。所以对于所有的非答案元素来说,它们第i位的和一定是3的倍数。然后再加上答案第i位的二进制0/1,结果要么还是3的倍数,要么就是3的倍数+1.所以我们最后只要对第i位的和%3,就可以拿出答案的第i位的二进制。

        得到第i位之后,我们需要将第i位设置好,如果是0则不必,如果是1,则需要将第i位变成1 ret |= (1<<i)

        时间复杂度:O(32*n), 我们需要遍历求出每一个二进制位,求每一个二进制时还需要遍历数组。

        空间复杂度:O(1),只使用了一个变量存储最终结果

// C++// 法一:
class Solution 
{
public:int singleNumber(vector<int>& nums) {unordered_map<int,int> mp;for(auto e : nums) mp[e]++;for(auto e : mp)if(e.second == 1) return e.first;return 0; // 为了符合语法规范}
};// 法二:
class Solution 
{
public:int singleNumber(vector<int>& nums) {int ret = 0;for(int i=0; i<32; ++i){int tmp = 0;for(auto e : nums){tmp += (e>>i)&1;}if(tmp % 3) ret |= (1<<i);}return ret;}
};

五.面试题 17.19. 消失的两个数字

1~n有n-1个数,数组中少了两个数,所以数组的大小加上2就是N。

这道题其实是之前两道题的结合版。数组中少个两个数,当我们求出N之后,将1~N和数组中的数结合其实,这道题不就变成了一个数组中,只有两个数出现了一次,其他都出现了两次,求这两个数。

解法:

        将数组和1~N这N个数都异或在一起,然后通过异或结果的最右侧的二进制是0还是1进行分类,重新进行异或,分类异或的结果就是答案

        时间复杂度:O(n),本质上我们就是遍历了4遍数组

        空间复杂度:O(1),只使用了两个变量来存储结果

// C++class Solution 
{
public:vector<int> missingTwo(vector<int>& nums) {// 求出N,然后转换成求一个数组所有的数都出现了两次,只有两个数出现了1次int n = nums.size()+2;int mark = 0;for(auto e : nums) mark ^= e;for(int i=1; i<=n; ++i) mark ^= i;int lao = mark & (-mark); // 找出最右侧的1int x1 = 0, x2 = 0;for(auto e : nums){if(e & lao) x1 ^= e;else x2 ^= e;}for(int i=1; i<=n; ++i){if(i & lao ) x1 ^= i;else x2 ^= i;}return {x1,x2};}
};

相关文章:

位运算算法题

一.判断字符是否唯一 法一&#xff1a; 我们直接借助一个字符数组来模拟哈希表统计字符串即可&#xff0c;并且我们没有必要先将所有字符都放入字符数组中&#xff0c;边插入边判断&#xff0c;当我们要插入某个字符的时候&#xff0c;发现其已经出现了&#xff0c;此时必然重复…...

12 向量结构模块(vector.rs)

一vector.rs源码 // Copyright 2013 The Servo Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE…...

Android车机DIY开发之学习篇(六)编译讯为3568开发板安卓

Android车机DIY开发之学习篇(六)编译讯为3568开发板安卓 1.SDK解压到家目录下的 rk3588_android_sdk 目录 一. 全部编译 ###安装所需环境 sudo apt-get update sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g…...

Codeforces Round 863 (Div. 3) E. Living Sequence

题目链接 头一回用不是正解的方法做出来&#xff0c;也是比较极限&#xff0c;直接说做法就是二分数位dp 数位 d p dp dp 求 1 − n 1-n 1−n出现多少含 4 4 4的数字个数 这纯纯板子了 \sout{这纯纯板子了} 这纯纯板子了 设 f ( x ) f(x) f(x) 为 1 − x 1-x 1−x 中含有4的…...

一文讲解HashMap线程安全相关问题(上)

HashMap不是线程安全的&#xff0c;主要有以下几个问题&#xff1a; ①、多线程下扩容会死循环。JDK1.7 中的 HashMap 使用的是头插法插入元素&#xff0c;在多线程的环境下&#xff0c;扩容的时候就有可能导致出现环形链表&#xff0c;造成死循环。 JDK 8 时已经修复了这个问…...

MFC 创建Ribbon样式窗口

然后点击下一步直到完成即可...

uv 安装包

是的&#xff0c;你可以使用 uv 来安装 Python 包。uv 是一个高性能的 Python 包安装器和解析器&#xff0c;由 astral.sh 团队开发&#xff0c;旨在替代 pip 和 pip-tools&#xff0c;提供更快的包安装体验。 ### 如何使用 uv 安装包 1. **安装 uv**&#xff1a; 如果你还…...

IELTS口语练习题库

IELTS口语1-4月题库 Part 1 Gifts Have you ever sent handmade gifts to others? Yes, I have. I once made a scrapbook for my best friend’s birthday. It included photos of our memories together and some handwritten notes. She loved it because it was personal…...

图书管理系统 Axios 源码__获取图书列表

目录 核心功能 源码介绍 1. 获取图书列表 技术要点 适用人群 本项目是一个基于 HTML Bootstrap JavaScript Axios 开发的图书管理系统&#xff0c;可用于 添加、编辑、删除和管理图书信息&#xff0c;适合前端开发者学习 前端交互设计、Axios 数据请求 以及 Bootstrap 样…...

基于OSAL的嵌入式裸机事件驱动框架——整体架构调度机制

参考B站up主【架构分析】嵌入式祼机事件驱动框架 感谢大佬分享 任务ID &#xff1a; TASK_XXX TASK_XXX 在系统中每个任务的ID是唯一的&#xff0c;范围是 0 to 0xFFFE&#xff0c;0xFFFF保留为SYS_TSK_INIT。 同时任务ID的大小也充当任务调度的优先级&#xff0c;ID越大&#…...

c++ string类 +底层模拟实现

提醒: 本片博客只是小编的听课笔记&#xff0c;介意勿看。 基础 包含在头文件<string>&#xff0c;才能使用string类似函数接口。 string常见构造类 string s1; cin>>s1;//无参构造 string s2(s1);//拷贝构造 string s1("jfksa");//传参构造 三种…...

六十分之三十七——一转眼、时光飞逝

一、目标 明确可落地&#xff0c;对于自身执行完成需要一定的努力才可以完成的 1.第三版分组、激励、立体化权限、智能设备、AIPPT做课 2.8本书 3.得到&#xff1a;头条、吴军来信2、卓克科技参考3 4.总结思考 二、计划 科学规律的&#xff0c;要结合番茄工作法、快速阅读、…...

Shell基础:中括号的使用

在Shell脚本中&#xff0c;中括号&#xff08;[ ... ] 和 [[ ... ]]&#xff09;是一种常见的条件测试结构。它们用于进行文件类型检查、值比较以及逻辑判断。通过了解它们的不同特点和用法&#xff0c;能够帮助你编写更加高效、安全且易读的脚本。本文将详细介绍Shell中单中括…...

《基于Scapy的综合性网络扫描与通信工具集解析》

在网络管理和安全评估中&#xff0c;网络扫描和通信是两个至关重要的环节。Python 的 Scapy 库因其强大的网络数据包处理能力&#xff0c;成为开发和实现这些功能的理想工具。本文将介绍一个基于 Scapy 编写的 Python 脚本&#xff0c;该脚本集成了 ARP 扫描、端口扫描以及 TCP…...

面经--C语言——sizeof和strlen,数组和链表,#include <>和 #include ““ #define 和typedef 内存对齐概述

文章目录 sizeof 和 strlen数组和链表总结 #include <>和 #include ""#define 和typedef内存对齐概述对齐规则示例&#xff1a;结构体的内存对齐分析&#xff1a; 内存对齐的常见规则&#xff1a;填充字节的计算对齐影响的实际例子 sizeof 和 strlen 特性size…...

使用 Kotlin 将 Vertx 和 Springboot 整合

本篇文章目的是将 Springboot 和 Vertx 进行简单整合。整合目的仅仅是为了整活&#xff0c;因为两个不同的东西整合在一起提升的性能并没有只使用 Vertx 性能高&#xff0c;因此追求高性能的话这是在我来说不推荐。而且他们不仅没有提高很多性能甚至增加了学习成本 一、整合流…...

线性回归算法-01

线性回归简介 学习目标 了解线性回归的应用场景知道线性回归的定义 1 线性回归应用场景 房价预测销售额度预测贷款额度预测 2 什么是线性回归 2.1 定义与公式 线性回归(Linear regression)是利用 回归方程(函数)对 一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模…...

洛谷 P1130 红牌 C语言

题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌。获得红牌的过程是相当复杂&#xff0c;一共包括 N 个步骤。每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件。为了加快进程&#xff0c;每一步政府都派了 M 个工作人员来检查材料。不幸的是&…...

虚幻UE5手机安卓Android Studio开发设置2025

一、下载Android Studio历史版本 步骤1&#xff1a;虚幻4.27、5.0、5.1、5.2官方要求Andrd Studio 4.0版本&#xff1b; 5.3、5.4、5.5官方要求的版本为Android Studio Flamingo | 2022.2.1 Patch 2 May 24, 2023 虚幻官网查看对应Andrd Studiob下载版本&#xff1a; https:/…...

线性代数复习笔记

1. 课程学习 1.1 3Blue1Brown 线性代数 2. 基本术语 eigenvector&#xff08;特征向量&#xff09;&#xff1a;线性变换中方向保持不变的向量 可以视作3D旋转矩阵形成的旋转的轴...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...

【Ftrace 专栏】Ftrace 参考博文

ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...