每天一道算法题-leetcode136-只出现一次的数字
前言
打卡第一天
2019.10.26日打卡
算法,即解决问题的方法。同一个问题,使用不同的算法,虽然得到的结果相同,但是耗费的时间和资源是不同的。这就需要我们学习算法,找出哪个算法更好。
大家都知道,算法是在面试大厂时不可或缺的一环。 而作为普通程序员的我们在工作中大都不怎么接触算法,那么如果以后想要进入大厂工作,提升自己,就必须通过刻意的练习,掌握算法和数据结构,提高编程能力。
“好”算法的标准
对于一个问题的算法来说,之所以称之为算法,首先它必须能够解决这个问题(称为准确性)。其次,通过这个算法编写的程序要求在任何情况下不能崩溃(称为健壮性)。如果准确性和健壮性都满足,接下来,就要考虑最重要的一点:通过算法编写的程序,运行的效率怎么样。
运行效率体现在两方面:
- 算法的运行时间。(称为“时间复杂度”)
- 运行算法所需的内存空间大小。(称为“空间复杂度”)
好算法的标准就是:在符合算法本身的要求的基础上,使用算法编写的程序运行的时间短,运行过程中占用的内存空间少,就可以称这个算法是“好算法”。
题目
每天一道leetcode136.只出现一次的数字
分类: 数组
题目链接: https://leetcode-cn.com/problems/single-number/
题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
题解
自己做
- 思路
使用额外HashMap来存储每一个数组元素,最后取出个数为1的那一个(看到题目,实在没有啥好思路,这个方法运行效率肯定非常低)
- 代码实现
class Solution {
public int singleNumber(int[] nums) {
Map<Integer, Integer> temp = new HashMap<>();
for (int i : nums) {
temp.put(i, temp.get(i) == null ? 1 : temp.get(i) + 1);
}
for (int i : nums) {
if (temp.get(i) == 1) {
return i;
}
}
return 0;
}
}
- 复杂度分析
- 时间复杂度:O(n+n) = O(n)。
for
循环的时间复杂度是 O(n)。 - 空间复杂度:O(n)。hashmap需要的空间跟nums中元素个数相等。
- 执行结果
最优解:位操作
- 思路
- 任何数与0异或为其本身:0 ^ n => n
- 相同的数异或为0: n ^ n => 0
- XOR(异或) 满足交换律和结合律:a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b
所以我们只需要将所有的数进行 XOR 操作,得到那个唯一的数字。
- 代码实现
class Solution {
public int singleNumber(int[] nums) {
int result = 0;
for(int i : nums) {
result^=i;
}
return result;
}
}
- 复杂度分析
- 时间复杂度:O(n)。只需要将nums元素遍历一遍,所以时间复杂度为nums中元素的个数。
- 空间复杂度:O(1)。
执行结果
结束语
建议大家起码做两遍以上,你可能会发现一些新的技巧或者方法。练习过程中,不是刻意去背这道题的答案,这不是长久之计,先不要参考答案,自己去解决问题,这样才能提高自己的思维能力以及编程能力。
今天是打卡第一天,了解了算法对工作以及今发展的重要性,需要花时间捡起来这部分知识。 可能由于是第一次打卡,今天足足花费了两个小时。
想一起打卡进步的朋友们,欢迎关注笔者公众号: 爱上敲代码, 会定期分享Java技术干活,让枯燥的技术游起来!
每天一道算法题-leetcode136-只出现一次的数字的更多相关文章
- 每天一道算法题(4)——O(1)时间内删除链表节点
1.思路 假设链表......---A--B--C--D....,要删除B.一般的做法是遍历链表并记录前驱节点,修改指针,时间为O(n).删除节点的实质为更改后驱指针指向.这里,复制C的内容至B(此时 ...
- 从一道算法题实现一个文本diff小工具
众所周知,很多社区都是有内容审核机制的,除了第一次发布,后续的修改也需要审核,最粗暴的方式当然是从头再看一遍,但是编辑肯定想弄死你,显然这样效率比较低,比如就改了一个错别字,再看几遍可能也看不出来,所 ...
- 【每天一道算法题】时间复杂度为O(n)的排序
有1,2,……一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度为O(1),使用交换,而且一次只能交换两个数. 这个是以前看到的算法题,题目不难.但是要求比较多,排序算法中,时间 ...
- 提前批笔试一道算法题的Java实现
题目描述 这是2021广联达校招提前批笔试算法题之一. 我们希望一个序列中的元素是各不相同的,但是理想和显示往往是有差距的.现在给出一个序列A,其中难免有相同的元素,现在提供了一种变化方式,使得经过若 ...
- LeetCode第136题:只出现一次的数字
问题描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...
- 一道算法题加深我对C++中map函数的理解
一.一道题目引发我对map函数的考量 首先是题目大意:有n个银行,a[i]表示这个人在第i个银行有a[i]块钱(可以是负数),所有银行的钱加起来正好是0.每次只能在相邻的银行之间转账,问最少要转多少次 ...
- 【每天一道算法题】Numeric Keypad
题目描述 The numberic keypad on your mobile phone looks like below: 123 456 789 0 suppose you are hold ...
- 一道算法题-八皇后问题(C++实现)
八皇后问题 一.题意解析 国际象棋中的皇后,可以横向.纵向.斜向移动.如何在一个8X8的棋盘上放置8个皇后,使得任意两个皇后都不在同一条横线.竖线.斜线方向上?八皇后问题是一个古老的问题,于1848年 ...
- 每天一道算法题(14)——N个降序数组,找到最大的K个数
题目: 假定有20个有序数组,每个数组有500个数字,降序排列,数字类型32位uint数值,现在需要取出这10000个数字中最大的500个. 思路 (1).建立大顶堆,维度为数组的个数,这里为20( ...
随机推荐
- MySQL学习(一)索引的基本认识
MySQL中,所有的数据类型都可以被索引,包括普通索引,唯一性索引,全文索引,单列索引,多列索引和空间索引等. 额外的:我已知的自动创建索引的时机:创建主键,唯一,外键约束的时候 一.索引简介 1.1 ...
- 解决VS2017授权问题及没有Add ArcGIS License Checking问题
内容源自:ArcGIS Engine+C#入门经典 老版本采用: 控件布局好后,需要对程序添加License许可.在Visual Studio的菜单栏上单击“项目”→单击“Add ArcGIS Lic ...
- AWD脚本之批量mysql写shell
摘之工具包中脚本 需要安装mysqldb.windwos环境直接在https://www.codegood.com/archives/129下载MySQL-python-1.2.3.win-amd64 ...
- 虚拟机Ubuntu系统无法连接网络解决方案
宿主机连接wifi,虚拟机无法联网 查看是否有网络图标 操作一: sudo service network-manager stopsudo rm /var/lib/NetworkManager/Ne ...
- stm32cubeMX配置LWIP
MCU:stm32f769NIHx PHY:LAN8742A LWIP_VERSION:2.0.3 1.配置RCC,串口(printf debug log) (1)开启RCC,配置时钟系统 图1.1 ...
- Windows下Python虚拟环境的配置
一.了解Python虚拟环境 所谓虚拟环境可以理解为不同的不连通的本地设备,打个比方就是在一台电脑上能做到多台电脑能做的事情. 例如:现在我们有两个项目需要不同的配置,记为A项目需要库a------- ...
- JavaScript如何工作:垃圾回收机制 + 常见的4种内存泄漏
原文地址: How JavaScript works: memory management + how to handle 4 common memory leaks 本文永久链接:https://d ...
- 百万年薪python之路 -- 模拟三次账号登录锁定功能
用代码实现三次用户登录及锁定(选做,时间充足建议做一做) 项目分析: 一.首先程序启动,显示下面内容供用户选择: 1.注册 2.登录 a.用户选择登录的时候,首先判断用户名在userinfo.txt表 ...
- react - 组件间的值传递
父组件向子组件传值 父组件通过属性进行传递,子组件通过props获取 //父组件 class CommentList extends Component{ render(){ return( < ...
- printf 格式输出代码大全
d,lx,ld,,lu,这几个都是输出32位的hd,hx,hu,这几个都是输出16位数据的,hhd,hhx,hhu,这几个都是输出8位的,lld,ll,llu,llx,这几个都是输出64位的, pri ...