一道有意思的面试算法题

新年第一篇文章,先祝大家新年快乐!!那么接下来进入正文。

前言

前阵子突发奇想,突然开始刷leetcode。其中刷到了一道有意思的题目,发现这道题是当时秋招的时候,腾讯面试官曾经问过我的题目。于是分享给大家看下。

题目描述

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

初步解法

这道题第一眼看过去,思路挺简单的,我们只需要维护一个对象来记录每一个元素出现的次数,使用元素的值作为key,元素出现的次数作为value。之后再遍历这个对象,找到value为1的key。对应的key就是那个元素。代码如下:


function singleNumber(nums) {const obj = {};for (let i = 0; i < nums.length; i++) {obj[nums[i]] = obj[nums[i]] ? obj[nums[i]] + 1 : 1;}for (let key in obj) {if (obj[key] === 1) {return Number(key); // 由于 key 是 string ,因此我们这里需要转化下}}
}console.log(singleNumber([2, 2, 1, 4, 4, 5, 5, 1, 8])); // 8

增加限制

是吧,这道题很简单,那我为什么要说它有意思呢?
因为题目里面其实还有一个限制:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

重点在于不使用额外空间。我们上面那种解法,创建了一个新的对象来储存结果,明显是不行的。那么有没有办法可以只使用原来的数组来实现这个功能呢?

最终解法

我们可以思考下,一个数组里,所有的数字都出现两次,除了一个我们要找的数字只出现一次。那么,我们有没有办法将两个相同的数字给过滤掉呢?

好啦,不卖关子了,之前有了解过的人应该就知道解决方案了,如果之前没了解过这方面东西的人,可以继续往下看。

解决方案:异或操作

异或运算是对于二进制数字而言的,比如说一个有两个二进制a、b,如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。

而javascript的按位异或(即^操作)操作,则会对两个数字相应的每一对比特位执行异或操作。

比如说 1 ^ 2,本质上其实是1和2的每一对比特位执行异或操作,等价于下面

00000000000000000000000000000001 // 数字1对应的二进制
^ 00000000000000000000000000000010 // 数字2对应的二进制
= 00000000000000000000000000000011 // 数字3对应的二进制

因此1^2的结果就为3啦。

那么如果两个相同的数字进行异或操作,结果就可想而知,答案为0啦。

如果是0和任何一个数字异或呢?结果是数字本身。

我们举个栗子:
假设我们有一个数组,里面元素为[a, a, c, c, b, b, d]。那么我们对数组里的所有元素进行按位异或操作,即a ^ a ^ c ^ c ^ b ^ b ^ d,是不是就等价于0 ^ 0 ^ 0 ^ d = d。而d就是数组里只出现一次的元素。
那么我们可以扩展一下,对于任意满足某个元素只出现一次以外,其余每个元素均出现两次的数组,是不是可以通过这种方式来得到那个只出现一次的元素。

这样一来的话,我们是不是有了这个问题的解决办法了?我们只需要遍历数组,将所有的值取异或,最终剩下的值,就是那个只出现一次的数字。代码如下:


/*** 只存在一次的数字* https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/1/array/25/* @param {number[]} nums* @return {number}*/
function singleNumber(nums) {for (let i = 1; i < nums.length; i++) {nums[0] ^= nums[i];}return nums[0];
};console.log(singleNumber([2, 2, 1, 4, 4, 5, 5, 1, 8]));

结语

这道面试题主要考验面试者对异或的理解,以及能不能活学活用,将这道题与异或联系在一起。当然,最重要的还是多学习、多刷题、多看书。这样才能不断进步。

本文地址在->本人博客地址, 欢迎给个 start 或 follow

来源:https://segmentfault.com/a/1190000017756829

转载于:https://www.cnblogs.com/qixidi/p/10224705.html

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

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

相关文章

JavaFX技巧1:可调整大小的Canvas

在使用FlexGanttFX时,我不得不处理很多JavaFX Canvas节点。 我正在使用它在时间轴上呈现活动。 甘特图中的每一行都是一个Canvas节点。 用户可以选择单独调整每行的大小。 因此,我不得不找出调整画布大小的最佳方法,这种现成的方法无法调整大…

Javolution 2.2.5 - Java Struct/Union Simplified

Multi-dimensional arrays of struct/union or of primitive types are also supported. Struct API: http://javolution.org/api/javolution/io/Struct.html转载于:https://www.cnblogs.com/perlye/archive/2005/02/04/102192.html

function

function foo(){function bar(){return 3;}return bar();function bar(){return 8;}}1.这个函数返回的是8 function foo1(){var bar1function(){return 3;};return bar1();var bar1function(){return 8;}}2.这个函数返回是3 alert(foo2());function foo2(){var bar2function(){…

12日疯人认证百度云_12月15日上海实习汇总(百度、美图、哔哩哔哩等)

上海实习实习汇总 | 实习内推 | 寒假实习博世 采购助理Job Title: 采购部实习生Job Description:1. Create Purchase Decision (PD), initiate internal approval workflow.2. Maintain basic data in SAP, SupplyOn, SRM, internal system Pilum .etc.3. Issue purchase order…

计算机通识必修课程学什么内容,计算机通识课程教学平台研究与探索.doc

计算机通识课程教学平台研究与探索计算机通识课程教学平台研究与探索摘要:在全国推行教育信息化大背景下,对民办大学计算机类通识课程的教学进行系统定位,结合实际情况利用Moodle开源软件搭建网络教学平台,进而改革优化现有的课程…

CF908G New Year and Original Order

题面 题意翻译 给定$n<10^{700}$&#xff0c;问$1$到$n$中每个数在各数位排序后得到的数的和。答案$mod\;10^97$。 题解 考虑设$f[i][j][k][0/1]$表示前$i$位有$j$位的数字大小$\geq k$&#xff0c;是否严格小于$n$的方案数 转移时&#xff0c;枚举第$i1$位填$p$ $$ f[i1][j…

15必须阅读Java 8教程

Java 8于上个月发布&#xff0c;其中充满了新功能和幕后优化。 互联网在覆盖所有这些新增加的方面&#xff08;包括好的和坏的&#xff09;一直做得很好。 我认为最好汇总一下我们认为是最好的一些教程&#xff0c;以帮助您快速掌握最新信息和需要了解的知识。 Java 8新功能列…

json 对象 数组

一、json写法以及获得其数据的方法 var jsons{ name:wen, age:12, price:qq } console.log(typeof jsons);//object console.log(jsons.name);//wen 二、Array(也是数组) 创建数组方法1&#xff1a;var myArraynew Array(8);创建一个储存8个数据的数组 创建数组方法3:var a…

随机森林和gbdt结合_决策树与迭代决策树(GBDT)

关注数学&#xff0c;关注AI&#xff0c;关注我们公众号ID&#xff1a;Math-AI阅读目录1. 决策树的模型2. 决策树的基本知识3. ID3、C4.5&CART4. Random Forest5. GBDT6. 参考内容今天我们来谈一谈机器学习算法中的各种树形算法&#xff0c;包括ID3、C4.5、CART以及基于集成…

猫眼html源码,50 行代码教你爬取猫眼电影 TOP100 榜所有信息

点击上方“CSDN”&#xff0c;选择“置顶公众号”关键时刻&#xff0c;第一时间送达&#xff01;今天&#xff0c;手把手教你入门 Python 爬虫&#xff0c;爬取猫眼电影 TOP100 榜信息。作者 | 丁彦军本文经授权转自「程序人生」对于 Python 初学者来说&#xff0c;爬虫技能是应…

在Spring中使用jOOQ:CRUD

jOOQ是一个库&#xff0c;可帮助我们重新控制SQL。 它可以从我们的数据库生成代码&#xff0c;并允许我们使用其流畅的API来构建类型安全的数据库查询。 本教程前面的部分向我们介绍了如何配置示例应用程序的应用程序上下文以及如何从数据库中生成代码。 现在&#xff0c;我们…

timeval的时间转换成毫秒之后多大的数据类型可以装下

struct timeval {long tv_sec; /*秒*/long tv_usec; /*微秒*/ }; 秒的定义为long&#xff0c;为了防止溢出&#xff0c;转换成毫秒之后保存在long long中转载于:https://www.cnblogs.com/AKUN-FYK/p/10981984.html

JuJu团队1月4号工作汇报

JuJu团队1月4号工作汇报 JuJu Scrum 团队成员今日工作剩余任务困难飞飞将model嵌入GUI美化UI无婷婷调试代码提升acc无恩升--写python版本的evaluate.jl无金华修改loader待安排无胡凯--考试无陈灿协调协调无PM报告 整个项目的任务量预期为250 people*hour&#xff0c; 目前已经解…

不知是福

很不喜欢自己的乌鸦嘴。我对很多的事情都有不好的预感&#xff0c;曾经以为那是我的消极观念所致&#xff0c;所以有时故意不去理会。待到许久之后&#xff0c;逐渐忘怀&#xff0c;所有的不好已经无所谓了…… 但是&#xff0c;有时偏偏过于好奇。正如昨天晚上。 因为好奇&…

使用data-自定义数据及如何获取该值

<!DOCTYPE html><html lang"en"><head> <meta charset"UTF-8"> <title>data-</title></head><body><p>h5新增属性data-的使用</p><ul id"u"> <li onclick"…

大数据技术与应用实训心得_GXCGQ16D传感器与检测技术应用实训考核设备

(一)产品概述依据国家人力资源与社会保障部《技工院校工学结合课程教学改革试点工作方案》设计&#xff0c;围绕典型工作任务(即传感器实训模块)确定课程目标&#xff0c;选择课程内容&#xff0c;制定专业教学计划&#xff0c;根据国家职业标准中相关内容。将机电工学结合中有…

计算机无法打开策略,Win10提示“无法打开此计算机上的组策略对象”如何解决...

为了更好地管理电脑&#xff0c;很多具体方法如下:1、我们先来看一下打开组策略编辑器的时候的错误提示如下图&#xff1b;2、关闭刚才的错误提示&#xff0c;进入电脑上c&#xff1a;/Windows/System323、接着点击工具栏上的“选项”按钮&#xff1b;4、在打开的文件夹选项窗口…

IIS 7.5绑定中文域名转码启动站点报“值不在预期的范围内”

问题现象 IIS 7.5在绑定中文域名转码后&#xff0c;启动站点会出现【值不在预期的范围内】&#xff1a; 解决方案此问题是由于中文域名绑定错误导致的&#xff0c;IIS 7.5针对中文域名会自动转换为punycode码&#xff0c;所以不需要绑定punycode码&#xff0c;如果要绑定中文域…

if判断代码 转变为 流程图

转换规则如下&#xff1a; if 代表一个菱形问号 if后面的条件代表菱形里的内容↓yes&#xff08;向下箭头和yes&#xff09; if同级的else代表右拐向下箭头和no 执行语句块代表一个矩形。 if 今天发工资:先还信用卡的钱if 有剩余:又可以happy了&#xff0c;O(∩_∩)O哈哈~else:…

刷新问题

最近新建立了一个MDI多文档工程,但不知道是何原因,只打开MDI父窗体进行界面界面就已经刷新不过来了,如果界面大小变化,更是不堪忍受,不知道是什么原因,而且我已经把窗体设置了不透明.页面的控件都变成模糊的,看不清,如下,请大家帮忙解决.转载于:https://www.cnblogs.com/bluecl…