跟LintCode的算法题杠上了(82落单的数)

article/2025/9/18 7:24:29

前言

今天闲来无事准备刷个算法题,缓解一下办公室尴尬的气氛,放松一下,谁知我竟然跟这题杠上了,我必须得好好研究一下,哈哈

题目

点击进入lintcode,第82题落单的数

给出 2 * n + 1个数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。

举例:

输入:[1,1,2,2,3,4,4]
输出:3
解释:
仅3出现一次,简单点理解就是找出数组中的唯一数

解题思路

先说这题没什么难度,可以利用set的不重复原理,当add 重复的时候会返回false;也可以利用map,如果包含这个key就+1;也可以利用数组排序,然后遍历数组,判断前后2个元素是否相等,如果不相等就返回这个数;然后还可以利用异或运算方法,反正方法有很多,关键是要找出最优算法。

方法一

本方法是循环数组,放入map中,然后把重复的元素的key 的value + 1,然后遍历map,找到key对应value = 1的那个 key就是了

时间复杂度:O(n)
空间复杂度:O(n)

    public static int singleNumber1(int[] A) {int a = 0;Map<Integer,Integer> map = new HashMap<>();for(int i=0;i<A.length;i++){if(map.containsKey(A[i])) {map.put(A[i], map.get(A[i]).intValue()+1);}else {map.put(A[i], new Integer(1));}}Iterator<Integer> iter = map.keySet().iterator();while(iter.hasNext()) {Integer key = iter.next();if(map.get(key) == 1){a = key;}}return a;}

方法二

本方法是对数组进行排序,如果长度=1就直接返回,然后相邻的2个元素进行比较,如果中间数和前一位比不相等,同时和后一位比也不相等,那么这个数就肯定是我们要找的唯一数。

时间复杂度:O(n)
空间复杂度:O(n)

    public static int singleNumber2(int[] A) {int b = 0;Arrays.sort(A);ArrayList<Integer> arr = new ArrayList<Integer>();int n = A.length;//如果只有1位数直接返回if(n == 1){return A[0];}for(int i =0; i < n; i ++){if(i == n-1 && A[i] != A[i - 1]){//当i = 最后一位,如果最后一位和倒数第二位不相等,就返回最后一位b = A[i];}else if(i == 0 && A[i] != A[i + 1]){//当i = 第一位,如果第一位和第二位不相等,就返回第一位b = A[i];break;}else{//当i = 中间位数,如果这个数 不等于前面的数,同时也不等于后面的数,就返回这个数if(i != 0 && i != n-1 && A[i] != A[i - 1] && A[i] != A[i + 1]){b = A[i];}}}return b;}

方法三(异或运算)

先来说说什么是异或运算:
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
利用位移交换的办法,把所有数字异或运算后即可得到只出现一次的数字。
例如:int a [] = {1,1,2,2,3,4,4};
那么1 ^ 1 ^ 2 ^ 2 ^ 3 ^ 4 ^ 4通过位移可以变成
(1 ^ 1) ^ (2 ^ 2) ^ (3 ^ 3) ^ (4 ^ 4) ^ 3 = 0 ^ 0 ^ 0 ^ 3 = 0 ^ 3 = 3
这个方法也是效率最高的,时间空间复杂度也是最优的

时间复杂度:O(n)
空间复杂度:O(n)

    public static int singleNumber3(int[] A) {int r = A[0];for(int i = 1; i < A.length; i ++){r ^= A[i];}return r;}

本机测试

    public static void main(String[] args) {int a [] = {1,1,2,2,3,4,4,5,6,5,7,6,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25};//int b = StringUtil.singleNumber3(a);long t1 = System.currentTimeMillis();int b1 = StringUtil.singleNumber1(a);long t2 = System.currentTimeMillis();System.out.println("-----方法1耗时(ms)-----" + (t2 - t1) + "----结果---" + b1);long t3 = System.currentTimeMillis();int b2 = StringUtil.singleNumber2(a);long t4 = System.currentTimeMillis();System.out.println("-----方法2耗时(ms)-----" + (t4 - t3) + "----结果---" + b2);long t5 = System.currentTimeMillis();int b3 = StringUtil.singleNumber3(a);long t6 = System.currentTimeMillis();System.out.println("-----方法3耗时(ms)-----" + (t6 - t5) + "----结果---" + b3);}

测试结果
在这里插入图片描述

最后

其实这只是一道简单的算法题,能做出来是前提,重要的是如何用效率最高,时间耗时最快,这才是算法的真谛,算法的实现方式有好多种,我们需要做的是找出最优算法来,如果你有更优秀的算法,或者觉得我写的方法不够优美,还有优化的空间,那么请留言,我们共同进步,谢谢支持!


http://chatgpt.dhexx.cn/article/97auvQbk.shtml

相关文章

扫码登陆

一个扫码登录的流程图记录一下

PC网站实现微信扫码登录功能(二)

上篇我们介绍了怎么申请账号以及最后拿到appId和appSecret,如果有不清楚的可以看一下 PC网站实现微信扫码登录功能&#xff08;一&#xff09; 下面我就来说一下怎样在PC端怎么实现扫码登录功能。 一、进入官方文档网站 准备工作 | 微信开放文档 其实官网对过程描述的已经…

微信扫描二维码快速登录网站

在近期的一个项目中用到了微信扫描注册、登录网站功能所以整理了下希望对读者有帮助。 首先&#xff0c;你需要有一个没有绑定微信、微信公众平台的邮箱注册成为微信开放平台开发者&#xff0c;在管理中心创建移动应用、或者网站应用获得appid和AppSecret&#xff0c;申请微信…

微信扫码登录功能实现

原因&#xff1a;很简单&#xff0c;公司的账号登录需要用到微信扫码登录与QQ的登录功能&#xff0c;所以&#xff0c;在做好了微信的扫码登录之后&#xff0c;本人就写这篇微信扫码登录功能实现的教程 教程开始 需要用到的网站&#xff1a; https://open.weixin.qq.com/ 微…

java扫码登录

这篇博文主要记录我实现扫码登录的步骤&#xff0c;及代码。其实之前从网上搜了很久扫码登录&#xff0c;copy版很多&#xff0c;所以回答也就那几种。 我把我自己的思路也说一下吧。如果有更好的意见或者我有不对的地方&#xff0c;请指出。 首先说一下我用的技术&#xff0…

微信公众号开发—扫描二维码实现登录方案

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 微信公众号开发—扫描二维码实现登录方案 ⏱️ 创作时间&#xff1a; …

第三方登录之微信扫码登录

文章目录 1. 申请微信接入&#xff1a;2. 项目环境搭建&#xff1a;3.后端Controller接口&#xff1a;4.HTML页面代码&#xff1a;5.测试结果&#xff1a;6.补充说明&#xff1a; 小伙伴们有各种疑问可以去参考官方文档进行详细的学习下 微信开发文档 &#xff0c;此次介绍的将…

扫码登录操作过程

转载自http://justcoding.iteye.com/blog/2213661浏览器输入&#xff1a;https://wx.qq.com/?langzh_CN手机登录微信&#xff0c;利用“扫一扫”功能扫描网页上的二维码手机扫描成功后&#xff0c;提示“登录网页版微信”&#xff1b;网页上显示“成功扫描 请在手机点击确认以…

实现手机扫描二维码进行登录

项目结构&#xff1a; 实现流程&#xff1a; pc端&#xff1a; 1:打开二维码登录网页index.html 2:index.html调用GetQrCodeServlet 3:GetQrCodeServlet干2件事 a:生成随机的uuid,是一个唯一标识&#xff0c;该标识贯穿整个流程 b:生成二维码图片&#xff0c;二维码信息&#x…

扫码登录,背后是如何实现的?

引言 近年来&#xff0c;随着智能手机和移动支付的普及以及互联网应用的不断更新迭代&#xff0c;扫码登录已经成为了我们日常生活中非常普遍的登录方式。扫码登录能够迅速的成为我们各大网站常用的登录方式一定存在它的原因。 首先一个非常重要的原因&#xff0c;扫码登录还可…

网站实现微信扫码登录

网站实现微信扫码登录 1 准备工作1.1 申请网站应用 2 快速开始2.1 微信扫码登录流程说明2.2 生成微信二维码的两种方式2.2.1 微信提供的二维码生成URL2.2.2 将微信登录二维码内嵌到自己页面 2.3 系统微信扫码登录示例2.3.1 流程说明2.3.2 核心代码2.3.2.1 前端代码2.3.2.2 后端…

【一】微信公众号之扫码登录

微信公众号之扫码登录 ​ 原来公司的官网就支持账号密码、手机验证码、QQ扫码授权、微信扫码授权等多种登录方式。今天要分享的就是关于微信扫码授权登录的原理。 一、准备工作 使用的是微信登录功能实现的&#xff0c;需要先在微信开放平台注册开发者帐号&#xff0c;并拥有一…

公众号扫码登录

1.流程概述 1.1 申请公众号 1.2 创建带参数的公众号二维码&#xff0c;参数值为scen_id的值 1.3 微信基础配置接口编写&#xff0c;get方式的接口为微信测试接口&#xff0c;必须能正常访问&#xff0c;post方式的接口为扫码回调接口&#xff0c;从请求中获取微信返回的xml包…

二维码扫描登录,你必须知道的 3 件事!

作者 | 互联网平头哥 本文经授权转载自互联网平头哥&#xff08;ID&#xff1a;it_pingtouge&#xff09; 扫二维码登录现在比较常见&#xff0c;比如微信、支付宝等 PC 端登录&#xff0c;并且好像每款 APP 都支持扫码登录&#xff0c;不搞个扫码登录都不好意思。作为技术人员…

微信扫码登录实现

需求 使用微信扫码登录的授权方式登录系统 实现 此扫码登陆过程中使用了&#xff0c;微信开放平台&#xff08;需支付300开通开发者认证&#xff09;的网站应用实现的。 官方文档&#xff1a;https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wec…

web扫码登录

文章目录 需求流程交互流程服务交互流程 关键思路代码生成二维码&#xff0c;返回给PC展示轮询查询二维码状态APP扫码请求登录 总结 需求 pc端实现app扫码登录 流程 交互流程 服务交互流程 关键思路 主要问题在于如何识别APP端用户&#xff0c;然后传递给PC端已经登录成功 …

开放平台–扫描微信二维码登录

准备 如不了解第三方登录流程&#xff0c;建议先大概了解一下&#xff0c;在来看看代码。 说明&#xff1a; 由于开放平台无测试号测试&#xff0c;所以只能上开放平台进行配置信息。公众平台的测试号并不能给开放平台使用。 微信开放平台地址&#xff1a;https://open.weixi…

二维码登陆

上一段时间研究微信公共账号,发现微信提供了一个扫码登陆验证的功能。近期头痛于经常忘记用户名密码,因此考虑是否可以结合这个功能,完成免密码登陆。百度后发现&#xff0c;有很多仁兄已经做过类似的功能了。 如这篇文章: 实现网站二维码扫描登录 仔细研究后&#xff0c;发现很…

二维码登录(三)扫码登录

承接上篇博客&#xff0c;在进行二维码生成之后&#xff0c;app进行扫码&#xff0c;扫码成功之后&#xff0c;手机点击登录&#xff0c;进行绑定登录关系&#xff0c;后台做自动关联与自动登录。 本文git地址&#xff1a;https://github.com/xvshu/qrlogin 1&#xff0c;扫码…