给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 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 和任何数字异或都是任何数字。

算法-----------数组------------只出现一次的数字相关推荐

  1. leetcode初级算法4.只出现一次的数字

    leetcode初级算法4.只出现一次的数字 仅为个人刷题记录,不提供解题思路 题解与收获 我的解法: public static int singleNumber(int[] nums) {if(n ...

  2. 数据结构与算法-- 数组中出现次数超过一半的数字(时间复杂度的讨论)

    时间效率 互联网想对时间效率格外的敏感,所以我们总是在需求迭代一定程度后去做优化.而且我们解决问题的时候,时间效率往往是一个考查的重点.因此我们平时编码过程中就必须不断的优化效率,追求完美的态度与能力 ...

  3. 数据结构与算法--数组中出一次的数字

    数组中出现一次的数字 题目:一个整型数组里面除了一个数字以外,其他数字都出现了两次.找出这个出现一次的数字,时间复杂度O(n),空间复杂度O(1) 如上题中最简单的方法就是一次循环统计,之后在循环判断 ...

  4. 初级算法:只出现一次的数字

    题目要求: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...

  5. Java算法之只出现一次的数字

    136 class Solution {public int singleNumber(int[] nums) {int item = nums[0];int j=1;while(j<nums. ...

  6. 算法题:找出整数数组中两个只出现一次的数字

    问题:一个整数数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度为O(n),空间复杂度为O(1). 分析:这是一个很新颖的关于位运算的题目. 首先考虑这 ...

  7. 算法题:“找出单身狗”--找出一个数组中只出现一次的数字

    题目:一个数组中只有两个数字是出现一次,其他所有数字都出现了两次. 编写一个函数找出这两个只出现一次的数字. 解题过程以及思路:(思路在代码中以注释形式给出) //一个数组中只有两个数字是出现一次,其 ...

  8. 程序员面试题精选100题(63)-数组中三个只出现一次的数字[算法]

    题目:一个数组中有三个数字a.b.c只出现一次,其他数字都出现了两次.请找出三个只出现一次的数字. 分析:在博客http://zhedahht.blog.163.com/blog/static/254 ...

  9. 程序员面试题精选100题(34)-数组中只出现一次的数字[算法]

    题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 分析:这是一道很新颖的关于位运算的面试题. 首先我们 ...

最新文章

  1. HDFS小文件问题及解决方案
  2. 舞伴问题数据结构java_Gale-Shapley算法解决舞伴问题过程详解(C++实现)
  3. WEB框架原理(socket)
  4. devices-list
  5. centos下升级jdk版本
  6. Jquery实战——横纵向的菜单
  7. 通过MVC模式将Web视图和逻辑代码分离
  8. 7.数电复刻 之 门电路
  9. 使用matlab生成高斯滤波模板_matlab实现图像高斯滤波
  10. 如何Word中修改Normal样式模板
  11. 苹果手机打电话没有声音怎么回事_手机打电话听筒没有声音,只有打开免提时才有声音,该怎么办?...
  12. 国际大会演讲ppt_2008年上半年会议演讲时间表
  13. H3C SecParh堡垒机任意用户登录与远程执行代码漏洞
  14. 分块专题整理(分块+莫队)
  15. python爬虫爬取豆瓣top排行图片
  16. 敏捷史话(十四):敏捷之峰的攀登者 —— Jim Highsmith
  17. 【虹科传感器小课堂】眨眼之见:通过气体检测进行热流量测量和校正
  18. 鸿蒙hilink的关系,华为继续应用鸿蒙OS助力智能生活 HiLink生态用户超过5000万
  19. Spark 论文篇-论文中英语单词集
  20. vue3使用windicss

热门文章

  1. im即时通讯源码_IM消息ID技术专题(六):深度解密滴滴的高性能ID生成器(Tinyid)
  2. 【源资讯 第37期】一个时代的终结 —— 再见, Flash !
  3. 腾讯云Ubuntu挂载硬盘空间
  4. JAVA 的wait(), notify()与synchronized同步机制
  5. win 2003 IIS如何防止代码注入
  6. PC Lint 初学
  7. 得到相对Plugin的路径
  8. 微信公众号签名错误 invalid signature
  9. vue中使用MD5加密
  10. vue填坑指南之模板的使用