基础数字(一)位运算 哈希(数组中元素出现次数)

news2024/11/28 4:40:02

目录

力扣剑指 Offer II 070. 排序数组中只出现一次的数字

数组中只出现一次的数(其它数出现k次)_牛客题霸

数组中只出现一次的两个数字_牛客题霸_牛客网

 数组中出现次数超过一半的数字_牛客题霸_牛客网

 缺失的第一个正整数_牛客题霸_牛客网


力扣剑指 Offer II 070. 排序数组中只出现一次的数字

给定一个只包含整数的有序数组 nums ,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。

你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。

【解法一】前后一起比较

class Solution {
public:
    int singleNonDuplicate(vector<int>& nums) {
        if(nums.size()==1) return nums[0];
        if(nums[0]!=nums[1]) return nums[0];
        for(int i=0;i<nums.size();){
            if(nums[i]!=nums[i+1]) return nums[i];
            i+=2;
        }
        return -1;
    }
};

【解法二】直接就是一个异或

class Solution {
public:
    int singleNonDuplicate(vector<int>& nums) {
        int res = 0;
        for(auto e : nums)
            res^=e;
        return res;
    }
};

 【解法三】二分法

class Solution {
public:
    int singleNonDuplicate(vector<int>& nums) {
        int left = 0;
        int right = nums.size()-1;
        while(left<right)
        {
            int mid = (left+right)>>1;
            if(nums[mid] == nums[mid^1])
                left = mid+1;
            else
                right = mid;
        }
        return nums[left];
    }
};

数组中只出现一次的数(其它数出现k次)_牛客题霸

给定一个长度为 n 的整型数组 arr 和一个整数 k(k>1) 。

已知 arr 中只有 1 个数出现一次,其他的数都出现 k 次。

请返回只出现了 1 次

数。

【解法一】排序之后进行逐k进行遍历


class Solution {
public:
    int foundOnceNumber(vector<int>& arr, int k) {
        // write code here
        sort(arr.begin(), arr.end());
        for(int i = 0; i < arr.size()-1; i += k)
        {
            if(arr[i] != arr[i+1])
                return arr[i];
        }
        return arr[arr.size()-1];
    }
};

【解法二】使用哈希遍历一遍然后查找值为1的数


class Solution {
public:
    int foundOnceNumber(vector<int>& arr, int k) {
        // write code here
        map<int,int>mp;
        for(auto e : arr)
            mp[e]++;
        for(auto e : arr)
            if(mp[e] == 1)
                return e;
        return -1;
    }
};

数组中只出现一次的两个数字_牛客题霸_牛客网

一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

数据范围:数组长度 2≤n≤10002≤n≤1000,数组中每个数的大小 0<val≤10000000<val≤1000000
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

【解法一】使用哈希遍历    注意运用mp接口的使用

class Solution {
public:
    vector<int> FindNumsAppearOnce(vector<int>& array) {
        // write code here
        map<int, int>mp;
        for(auto e : array)
        {
            mp[e]++;
        }
        vector<int> res;
        for(auto it = mp.begin(); it!=mp.end(); it++)
        {
            if(it->second == 1)
                res.push_back(it->first);
        }
        if(res[0]>res[1])
        swap(res[0], res[1]);
        return res;
    }
};

【解法二】使用异或运算

 注意点  异或操作 0 XOR a = a   a XOR a = 0

从第一个数开始俩俩之间进行异或操作,如果后一个数与前一个异或后的数不相等 只有俩种情况,一种是前面是俩相同的数,异或之后结果为0,0与第i个数不相同,这种只需要继续进行异或即可,还有一种是遇到了前后俩个数不相同情况,那么就是找到了,把当前i指向的数放入res数组中即可。找到一个后重新开始,将x重新初始为0,继续进行如此操作

class Solution {
public:
    vector<int> FindNumsAppearOnce(vector<int>& array) {
        // write code here
        sort(array.begin(), array.end());
        vector<int> res;
        int x = 0;
        for(int i = 0; i < array.size()-1; i++)
        {
            x ^= array[i];
            if(array[i+1]!=x && x!=0)
            {
                res.push_back(array[i]);
                x = 0;
            }
        }
        if(res.size()==1)res.push_back(array.back());
        return res;
    }
};

 数组中出现次数超过一半的数字_牛客题霸_牛客网

给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

数据范围:n≤50000n≤50000,数组中元素的值 0≤val≤100000≤val≤10000

要求:空间复杂度:O(1)O(1),时间复杂度 O(n)O(n)

【解法一】排序取中

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        sort(numbers.begin(), numbers.end());
        return numbers[numbers.size() / 2];
    }
};

【解法二】哈希表

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        map<int, int> mp;
        int n = numbers.size();
        for(auto e : numbers)
        {
            mp[e]++;
            if(mp[e] > n/2)
                return e;
        }
        return 0;
    }
};

 缺失的第一个正整数_牛客题霸_牛客网

给定一个无重复元素的整数数组nums,请你找出其中没有出现的最小的正整数

进阶: 空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

数据范围:

−231≤nums[i]≤231−1−231≤nums[i]≤231−1

0≤len(nums)≤5∗1050≤len(nums)≤5∗105

【解法一】暴力查找(找之前排序一下哦 不然会超时 嘻嘻嘻)

class Solution {
public:
    int minNumberDisappeared(vector<int>& nums) {
        // write code here
        sort(nums.begin(), nums.end());
        int i = 1;
        while(1)
        {
            if(find(nums.begin(),nums.end(),i++)==nums.end())
            {
                return i-1;
            }
        }
        return 0;
    }
};

【解法二】哈希 跟我的方法一差不多诶,不过人家哈希表的find时间复杂度为O(1)慕了慕了

class Solution {
public:
    int minNumberDisappeared(vector<int>& nums) {
        // write code here
        map<int, int>mp;
        for(auto e : nums)
            mp[e]++;
        int res = 1;
        while(mp.find(res) != mp.end())
            res++;
        return res;
    }
};

 

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

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

相关文章

[杂记]算法:前缀和与差分数组

这篇讲一下前缀和与差分数组的关系 1. 前缀和 1.1 一维数组前缀和 前缀和在处理数组中的连续子数组的某一段加和的问题中很有用, 因为是拿空间换时间, 可以将线性复杂度降低为常数时间复杂度. 前缀和的道理很简单, 对于数组arr[i],i0,...,n−1arr[i], i 0, ..., n - 1arr[i…

《Linux Shell脚本攻略》学习笔记-第四章

4.1 简介 本章主要介绍sed、awk、grep、cut等命令&#xff0c;这些工具可以相互结合以满足文本处理需求。 正则表达式是一种基础的模式匹配技术。 4.2 使用正则表达式 正则表达式是由字面文本和具有特殊意义的符号组成的。 1&#xff09;位置标记 位置标记锚点是标识字符串位置…

Anaconda安装、opencv环境配置、jupyter notebook使用虚拟环境

目录一、Anaconda 的安装二、opencv 3.4.1.15版本安装三、jupyter notebook使用虚拟环境四、运行报错-缺库一、Anaconda 的安装 Anaconda官网&#xff1a;Anaconda Installers Anaconda历史版本&#xff1a;Anaconda Index of 这边建议和我装一样anaconda3 python3.7&#xf…

opencv的图像基本操作(基于jupyter Notebook)

opencv的基本操作cv2是opencv在python中的缩写&#xff0c;函数开头用cv2cv2.imread(cat.jpg) #读入图片cat.jpgcv2.imwrite(mycat.png,img) #图片img保存为mycat.pngcv2.imshow(image,img) #创建窗口&#xff0c;显示图像cv2.waitKey(10000) #等待时间&#xff0c;以 毫秒为单…

整数分解

问题描述 将 3 分解成两个正整数的和, 有两种分解方法, 分别是 312312 和 321321 。注意顺序不同算不同的方法。 将 5 分解成三个正整数的和, 有 6 种分解方法, 它们是 113122113122 131212221311131212221311 。 请问, 将 2021 分解成五个正整数的和, 有多少种分解方法? …

Android大厂面试100题,涵盖测试技术、环境搭建、人力资源

测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 2、我现在有个程序&#xff0c;发现在Windows上运行得很慢&#xff0c;怎么判别是程序存在问题还是软硬件系统存在问题&#xff1f; 3、测试的策略有哪些&#xff1f; 4、正交表测试用例…

Sinutrain下载安装与开启OPC UA---kalrry

Sinumerik下载安装与开启OPC UA---kalrry前言一、安装前准备二、Win7安装1、软件安装2、开启授权3、文件配置4、客户端连接三、Win10/11安装四、启动后使用前言 本教程只适用于 Sinutrain-v4.7 版本&#xff0c;其他版本配置目录有所改变建议安装到默认路径&#xff0c;否则后…

【云原生】k8s安全机制

内容预知 前言 1. 认证&#xff08;Authentication&#xff09; 1.1 k8s集群内的三种认证方式 1.2 k8s集群内的认证说明 &#xff08;1&#xff09;需要被认证的访问类型 &#xff08;2&#xff09;安全性说明 &#xff08;3&#xff09;证书颁发的方式 &#xff08;4&a…

Qt中使用qt自带的函数实现各种进制间的相互转换,easy.

文章目录一.十进制转各种进制第一种&#xff1a;使用QString的静态函数number第二种&#xff1a;使用QString的拼接函数arg二.各种进制相互转换一.十进制转各种进制 第一种&#xff1a;使用QString的静态函数number ①使用QString的静态函数number即可&#xff0c;如我把字符…

嵌入式linux-进程状态与进程关系

1. 进程状态 1.1什么是进程状态 Linux 系统下进程通常存在 6 种不同的状态&#xff0c;分为&#xff1a;就绪态、运行态、僵尸态、可中断睡眠状态&#xff08;浅度 睡眠&#xff09;、不可中断睡眠状态&#xff08;深度睡眠&#xff09;以及暂停态。 下面我们来一一总结一下&…

数据湖之Hudi基础:入门介绍和编译部署

主要记录下Hudi的概述和打包编译等内容&#xff0c;方便参考 文章目录简介官网发展历史Hudi特性使用场景安装部署编译环境准备编译hudi1.源码包上传到服务器2.修改pom文件3.修改源码兼容hadoop34.手动安装kafka依赖&#xff08;非必须&#xff09;5.解决spark模块依赖冲突6.执行…

【基础篇】4 # 链表(上):如何实现LRU缓存淘汰算法?

说明 【数据结构与算法之美】专栏学习笔记 链表结构 数组需要一块连续的内存空间来存储&#xff0c;对内存的要求比较高&#xff0c; 而链表并不需要一块连续的内存空间&#xff0c;它通过指针将一组零散的内存块串联起来使用。 结点&#xff1a;指的是内存块后继指针 next…

Postgresql源码(98)lex与yacc的定制交互方式

1 背景知识一&#xff1a;LEX %option prefix Postgresql中使用%option prefix"core_yy"&#xff0c;影响范围&#xff1a;yy_create_buffer,yy_delete_buffer,yy_flex_debug,yy_init_buffer,yy_flush_buffer,yy_load_buffer_state,yy_switch_to_buffer,yyin,yyleng…

【并发编程十一】c++线程同步——future

【并发编程十一】c线程同步——future一、互斥二、条件变量三、future1、promise1.1、子线程设值&#xff0c;主线程获取1.2、主线程设置值&#xff0c;子线程获取1.3、shared_future2、async2.1、不开新线程的async2.2、开新线程的async3、packaged_task3.1、不使用bind3.2、提…

Kafka-概述

一、Kafka是什么 1.定义 Apache Kafka 是一款开源的消息引擎系统。 消息引擎系统是一组规范。企业利用这组规范在不同系统之间传递语义准确的消息&#xff0c;实现松耦合的异步式数据传递。 二、消息队列的使用场景 传统消息队列的应用场景包括 缓存/削峰、解耦、异步通信 …

vue(透传属性,$attrs)

官方文档 https://cn.vuejs.org/guide/components/attrs.html 案例 <FirstLevel class"attr-test-class" name"zs" age"18"></FirstLevel>FirstLevel组件没有用props去申明name和age&#xff0c;所以这两个属性会透视传递。 <…

RT-Thread系列--组件初始化

一、目的RT-Thread里面有个特别有意思的软件设计叫做组件自动初始化。有些小伙伴可能是第一次听说&#xff0c;所以这边我解释一下&#xff0c;请看下面的代码片段static void clock_init() {// 时钟初始化 } static void uart_init() {// 串口初始化 } static void i2c_init()…

SpringBoot自定义拦截器

&#x1f341;博客主页&#xff1a;&#x1f449;不会压弯的小飞侠 ✨欢迎关注&#xff1a;&#x1f449;点赞&#x1f44d;收藏⭐留言✒ ✨系列专栏&#xff1a;&#x1f449;SpringBoot专栏 &#x1f525;欢迎大佬指正&#xff0c;一起学习&#xff01;一起加油&#xff01; …

JavaScript 浏览器的重排和重绘

文章目录JavaScript 浏览器的重排和重绘概述浏览器解析过程重排重绘优化将多次改变样式的属性操作合并为一次需要多次重排的元素设置为绝对定位减少DOM操作复杂元素处理先设置display为none处理完后再显示缓存频繁操作的属性减少使用table布局使用事件委托绑定事件处理程序利用…

上海亚商投顾:沪指重返3200点 牛市旗手回归!

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日继续走强&#xff0c;沪指重返3200点上方&#xff0c;创业板指午后一度涨近3%&#xff0c;随后涨幅有所…