LeetCode —— 137. 只出现一次的数字 II

在这里插入图片描述
请添加图片描述

😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️
💥个人主页:🔥🔥🔥大魔王🔥🔥🔥
💥所属专栏:🔥魔王的修炼之路–C++🔥
如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的点赞👍和关注💖,支持一下博主。同时记得收藏✨这篇文章,方便以后重新阅读。

137. 只出现一次的数字 II

这个题在力扣是中等标签,虽然不等于它很难, 但他绝对不简单,比如这个题虽然单纯做题是很简单,但是规定了时间和空间复杂度,那么就难了起来。

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。
示例 1:
输入:nums = [2,2,3,2]
输出:3
示例 2:
输入:nums = [0,1,0,1,0,1,99]
输出:99
提示:
1 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次

下面是错误的写法,没有考虑时间和空间复杂度。

// // //复杂度不行 可能是因为递归层次太深,递归每次都会在栈开空间,最会情况就是开n次
// class Solution {
// public:
//     int singleNumber(vector<int>& nums) {
//         sort(nums.begin(), nums.end());
//         int i = 0;
//         if(nums[0] != nums[1])
//             return nums[0];
//         i += 3;
//         while(i < nums.size() - 1)
//         {   
//             if(nums[i] != nums[i + 1])
//                 return nums[i];
//             i += 3;
//         }
//         return nums.back();
//     }
// };

首先sort排序使用的快排,快排一般情况下时间复杂度是NlogN,最坏的话就是 N^2,就这个一般情况来说,NlogN是对数线性复杂度,他介于线性和二次方之间,线性一般指的是O(N)这样子的;对于它的空间复杂度也是不满足的,因为递归造成的空间复杂度也是算的,不过可能实现的快排不是递归,而且库里的sort底层实现也可能不只快排而是几中排序的结合优化版,不过时间复杂度通常就是O(N*logN),至于空间复杂度,O(logN),就和一般情况下的快排一样,递归实现的快排而且是最坏情况的话,那么就是O(N)了。

正确解法

//分别将这些数对应二进制位的1有几个存到整型数组p中,然后分别 % 3,是3的倍数的就没了
class Solution {
public:int singleNumber(vector<int>& nums) {size_t arr[32] = {0};size_t a = 1;int flag = 0;int special = 0;for(auto x: nums)//存1{if(x < 0){if(x == -2147483648)//这样也不行,因为这个形参里面的类型int,最小的负数转为正数就越界了,比如char,最大 127,最小-128{x += 1;special++;}x *= -1;//负数变成补码就反了一下,不适合了。   flag++;}for(int i = 0; i < 32; i++){if(((a << i) & x) != 0){arr[i]++;}}}int num = 0;int system = 31;for(int i = 0; i < 32; i++){if(i == 31){cout  << "进来了" << endl;arr[i] %= 3;}if(arr[i] % 3 != 0){num += pow(2, i); }}if(flag % 3 != 0)num *= -1;if(special == 1)num--;return num;}
};

这里面最有价值的是里面没有通过排序,然后找单独数字就是直接开辟一个常量级(32个int)的空间,通过记录这些数二进制位的总位数,然后判断哪个 % 3 不等0,那么该数就是单独的。
有个小问题,如果是负数的话,那么在内存中就是补码,上面写的代码就不适合了,但是数据中可能有负数,所以只能将负数改为正数,这是不影响的,但是有一点,负数最大数的绝对值比正数大1,因为就像char,最大127,最小-128,所以转的时候就爆了,超出int范围。
当然这只是自己的解法,所以有个这个坑,要特殊处理一下,肯定有比这好的方法,但是自己真想不出来了,也不想看题解。

  • 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。

🌈专栏推荐
😈魔王的修炼之路–C语言
😈魔王的修炼之路–数据结构初阶
😈魔王的修炼之路–C++
😈魔王的修炼之路–Linux
更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。

请添加图片描述

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

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

相关文章

一二三应用开发平台文件处理设计与实现系列之7——minio多节点共享磁盘模式验证

背景 在不了解minio架构设计之前&#xff0c;我根据既往经验推测minio是将文件读写封装实现了一个应用系统&#xff0c;如要实现高可用&#xff0c;则需要部署两个minio节点&#xff0c;共享同一块磁盘。两个minio节组成一个集群&#xff0c;使用nginx实现负载均衡&#xff0c…

Python下载安装与环境配置

本文将指导您完成Python的下载、安装以及环境配置过程&#xff0c;确保您在编写和运行Python代码时能够获得最佳体验。我们将提供详细的步骤和代码示例&#xff0c;帮助您顺利完成设置。 一、Python下载与安装 访问Python官网&#xff1a;首先&#xff0c;您需要访问Python的官…

通俗易懂三大范式

通俗易懂三大范式 第一范式说的是每个字段不可再分 第二范式说的是不能存在部分依赖&#xff08;不能由联合主键的部分就可以推出其他字段&#xff0c;必须整个联合主键才能推出其他字段&#xff09; 第三范式说的是不能存在间接依赖(A&#xff08;主键&#xff09;→B,B→C…

学习嵌入式第十五天之结构体

用变量a给出下面的定义 a) 一个整型数&#xff08;An integer&#xff09; //int a;b) 一个指向整型数的指针&#xff08;A pointer to an integer&#xff09; //int *a;c) 一个指向指针的的指针&#xff0c;它指向的指针是指向一个整型数&#xff08;A pointer to a poin…

前端Web开发

安装flask框架 pip install flask 导入flask模块 from flask import Flask 【可能遇到的问题】 出现了如下警告&#xff1a; WARNING: You are using pip version 21.2.4; however, version 22.0.4 is available.You should consider upgrading via the D:\Python\python…

【Tomcat与网络2】一文理解Servlet是怎么工作的

在前面&#xff0c;我们研究了如何用idea来启动一个Servlet程序&#xff0c;今天我们就再来看一下Servlet是如何工作的。 目录 1.Servlet 介绍 2.Servlet 容器工作过程 3.Servlet的扩展 不管是电脑还是手机浏览器&#xff0c;发给服务端的就是一个 HTTP 格式的请求&#xf…

力扣hot100 划分字母区间 贪心 思维 满注释版

Problem: 763. 划分字母区间 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 代码随想录 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code class Solution {public List<Integer> partitionLabels(String s){// 创建哈希…

基于SpringBoot的高校社团管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是何时&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML 我欲乘风归去 又恐琼楼玉宇 高处不胜寒 -苏轼 目录 一、项目简介 二、开发技术与环境配置 2.1 SpringBoot框架 2…

Activiti工作流引擎

一、工作流介绍&#xff1a; 1.1 概念&#xff1a; 工作流(Workflow)&#xff0c;就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程&#xff0c;从而实现某个预期的业务目标&#xff0c;或…

CRM系统能为企业解决5大痛点

客户关系管理&#xff08;CRM&#xff09;系统是企业最有价值的工具之一&#xff0c;但也可能是管理最复杂的工具之一。如果运用得当&#xff0c;CRM系统将帮助企业提高效率&#xff0c;实现增长。一项研究报告指出&#xff0c;客户关系管理工具可将销售额提高 29%&#xff0c;…

LoadRunner从零开始之LoadRunner脚本语言基础

在用LoadRunner 做性能测试的过程中&#xff0c;编写脚本是 一项非常重要的工作。不夸张地说&#xff0c;一个脚本的好坏关系到性能测试的成败。“ 工欲善其事&#xff0c;必先利其器” &#xff0c; 在本章我们将学习LoadRunner 脚本语言以及脚本的开发技巧。 下面 我 们 要 通…

【网络】:网络套接字(TCP)

网络套接字&#xff08;TCP&#xff09; 一.编写TCP服务器二.编写Tcp客户端三.多进程四.多线程版本五.线程池版完整源代码六.使用示例 一.编写TCP服务器 1.先搭一个架子 2.创建sockfd domain参数依然是AF_INET(因为是IPV4) type方式选择SOCK_STREAM&#xff08;提供可靠的连接…