算法-----------数组------------只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]
输出: 1
示例 2:输入: [4,1,2,1,2]
输出: 4
我的解答:
第一版:耗时 125 ms
class Solution {public int singleNumber(int[] nums) {if (nums == null) {return -1;}int length = nums.length ;if (length == 1) {return nums[0];}int numCount;int j,k;for (int i = 0 ; i< length ;){j = k = i + 1;numCount = 0;for (; j<length; j++){if (nums[i] == nums[j]){numCount ++;//交换nums[j] = nums[k];nums[k] = nums[i];k++;}}if (numCount == 0){return nums[i];}i = k;}return nums[length-1];}
}
第二版:耗时12 ms
class Solution {public int singleNumber(int[] nums) {if (nums == null) {return -1;}int length = nums.length ;if (length == 1) {return nums[0];}Arrays.sort(nums);for (int i =0,j,k; i< length; ){j = k = i+1;if (i != length -1) {if (nums[j] != nums[i]) {return nums[i];}else {while (k< length && nums[k++] == nums[i]){}i = k-1;}}else {i++;}}return nums[length -1];}
}
网上最快的版本:耗时1ms
class Solution {public int singleNumber(int[] nums) {for (int i = 1, len = nums.length; i < len; i += 2) {nums[0] ^= nums[i] ^ nums[i+1];}return nums[0];}
}
总结:
总结: 所有的数字都是二进制,时刻铭记。真的是善用位运算符。
算法确实可以让人学到东西。
这个人的想法,真的佩服,自己看了大概5分钟才明白,而且是把所有的数字变成二进制之后,看懂的。当然,这个算法是有局限性的,只有在除了某个元素只出现一次以外,其余每个元素均出现两次,这种前提下才没有问题。否则的话,会出现ArrayIndexOutOfBoundsException。还有,1,1,1,2 这种就会算出错误的结果。
最快的算法大概思路是这样的:
比如我有三个数字,1,1,2.
那么三个数异或,就是只有一个的数字。因为异或,两个一样的数字1,1 异或是0. 0 和任何数字异或都是任何数字。
算法-----------数组------------只出现一次的数字相关推荐
- leetcode初级算法4.只出现一次的数字
leetcode初级算法4.只出现一次的数字 仅为个人刷题记录,不提供解题思路 题解与收获 我的解法: public static int singleNumber(int[] nums) {if(n ...
- 数据结构与算法-- 数组中出现次数超过一半的数字(时间复杂度的讨论)
时间效率 互联网想对时间效率格外的敏感,所以我们总是在需求迭代一定程度后去做优化.而且我们解决问题的时候,时间效率往往是一个考查的重点.因此我们平时编码过程中就必须不断的优化效率,追求完美的态度与能力 ...
- 数据结构与算法--数组中出一次的数字
数组中出现一次的数字 题目:一个整型数组里面除了一个数字以外,其他数字都出现了两次.找出这个出现一次的数字,时间复杂度O(n),空间复杂度O(1) 如上题中最简单的方法就是一次循环统计,之后在循环判断 ...
- 初级算法:只出现一次的数字
题目要求: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...
- Java算法之只出现一次的数字
136 class Solution {public int singleNumber(int[] nums) {int item = nums[0];int j=1;while(j<nums. ...
- 算法题:找出整数数组中两个只出现一次的数字
问题:一个整数数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度为O(n),空间复杂度为O(1). 分析:这是一个很新颖的关于位运算的题目. 首先考虑这 ...
- 算法题:“找出单身狗”--找出一个数组中只出现一次的数字
题目:一个数组中只有两个数字是出现一次,其他所有数字都出现了两次. 编写一个函数找出这两个只出现一次的数字. 解题过程以及思路:(思路在代码中以注释形式给出) //一个数组中只有两个数字是出现一次,其 ...
- 程序员面试题精选100题(63)-数组中三个只出现一次的数字[算法]
题目:一个数组中有三个数字a.b.c只出现一次,其他数字都出现了两次.请找出三个只出现一次的数字. 分析:在博客http://zhedahht.blog.163.com/blog/static/254 ...
- 程序员面试题精选100题(34)-数组中只出现一次的数字[算法]
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 分析:这是一道很新颖的关于位运算的面试题. 首先我们 ...
最新文章
- HDFS小文件问题及解决方案
- 舞伴问题数据结构java_Gale-Shapley算法解决舞伴问题过程详解(C++实现)
- WEB框架原理(socket)
- devices-list
- centos下升级jdk版本
- Jquery实战——横纵向的菜单
- 通过MVC模式将Web视图和逻辑代码分离
- 7.数电复刻 之 门电路
- 使用matlab生成高斯滤波模板_matlab实现图像高斯滤波
- 如何Word中修改Normal样式模板
- 苹果手机打电话没有声音怎么回事_手机打电话听筒没有声音,只有打开免提时才有声音,该怎么办?...
- 国际大会演讲ppt_2008年上半年会议演讲时间表
- H3C SecParh堡垒机任意用户登录与远程执行代码漏洞
- 分块专题整理(分块+莫队)
- python爬虫爬取豆瓣top排行图片
- 敏捷史话(十四):敏捷之峰的攀登者 —— Jim Highsmith
- 【虹科传感器小课堂】眨眼之见:通过气体检测进行热流量测量和校正
- 鸿蒙hilink的关系,华为继续应用鸿蒙OS助力智能生活 HiLink生态用户超过5000万
- Spark 论文篇-论文中英语单词集
- vue3使用windicss