leecode刷题(5)-- 只出现一次的数字

只出现一次的数字

描述:

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

说明:

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

示例:

输入: [4,1,2,1,2]

输出: 4

思路:

因为“除了某个元素只出现一次一次,其余每个元素均出现两个”,所以如果该数组有序,且有一个元素只出现一次,以步数2向后遍历,那么一定会存在a[i] != a[i+1]。所以我们可以将数组排序,然后隔两个元素比较一次,看相邻元素的值是否相等,若不相等,即为我们要找得出现一次的数字。

因为我们这里用到了排序,排序的时间复杂度为 O(nlogn),不是线性时间复杂度 O(n),其实并不是很好。

代码如下:

import java.util.Arrays;

public class SingleNumber {
public int singleNumber(int[] nums) {
if (nums.length == 0) {
return -1;
}
if (nums.length == 1) {
return nums[0];
} Arrays.sort(nums);
for (int i = 0; i < nums.length; i += 2) {
if (i == nums.length - 1) {
return nums[i];
}
if (nums[i] != nums[i + 1]) {
return nums[i];
}
}
return 0;
} public static void main(String[] args) {
int[] nums = {2,2,4,3,3};
SingleNumber singleNumber = new SingleNumber();
int a = singleNumber.singleNumber(nums);
System.out.println(a);
}
}

改进:

我们可以使用异或的方法,便能很完美的解决这个问题。

所谓异或,即为:参与运算的两个元素,两者的值不同返回true,两者的值相同返回false。

通过学习计算机基础,我们知道异或表达式有几个规律:

  1. 恒定律:A ^ 0 = A
  2. 归零率:A ^ A = 0
  3. 交换律:A ^ B = B ^ A
  4. 结合律:(A ^ B) ^ C = A ^ (B ^ C)

这里我们举个例子:

比如我们的数组为:{2,3,2,3,1}

我们使用异或运算:

  2^3^2^3^1
= 2^2^3^3^1
= 0^0^1
= 1

所以看到这里,大家是不是懂了,我们让数组中的元素做异或运算,结果便为要找的 ”只出现一次的数字“。

代码如下:

import java.util.Arrays;

public class SingleNumber {
public int singleNumber(int[] nums){
if (nums.length == 0) {
return -1;
}
if (nums.length == 1) {
return nums[0];
} int result = 0;
for (int i =0; i < nums.length; i++) {
result = result ^ nums[i];
}
return result;
} public static void main(String[] args) {
int[] nums = {2,2,4,3,3};
SingleNumber singleNumber = new SingleNumber();
int a = singleNumber.singleNumber(nums);
System.out.println(a);
}
}

可以看到,时间复杂度为 O(n),符合题目线性时间复杂度的要求。

leecode刷题(5)-- 只出现一次的数字的更多相关文章

  1. LeetCode刷题1——只出现一次的数字

    一.题目要求 二.题目背景 位运算:或,异或,与,移位 三.解题思路 (1)要求算法时间复杂度是线性的,O(n),想到的是先将列表排序,排序后相同的数值两两之间前后相邻,进行偶数次循环,判断两两数值是 ...

  2. leecode刷题(20)-- 删除链表中的节点

    leecode刷题(20)-- 删除链表中的节点 删除链表中的节点 描述: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = ...

  3. leecode刷题(19)-- 最长公共前缀

    leecode刷题(19)-- 最长公共前缀 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: [&quo ...

  4. leecode刷题(16)-- 字符串转换整数

    leecode刷题(16)-- 字符串转换整数 字符串转换整数 描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格 ...

  5. leecode刷题(17)-- 实现StrStr

    leecode刷题(17)-- 实现StrStr 实现StrStr 描述: 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串 ...

  6. leecode刷题(15)-- 验证回文字符串

    leecode刷题(15)-- 验证回文字符串 验证回文字符串 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 ...

  7. leecode刷题(14)-- 有效的字母异位词

    leecode刷题(14)-- 有效的字母异位词 有效的字母异位词 描述: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词. 示例 1: 输入: s = " ...

  8. leecode刷题(13) -- 字符串中的第一个唯一字符

    leecode刷题(13) -- 字符串中的第一个唯一字符 字符串中的第一个唯一字符 描述: 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = & ...

  9. leecode刷题(12)-- 整数反转

    leecode刷题(12)-- 整数反转 整数反转 描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: - ...

随机推荐

  1. Lambda中的常用sql方法

    1.Groupby 对集合进行分组,如: var dllList = _menuMan.Load(c => c.TXT_ASSEMBLYNAME != null).GroupBy(c=>c ...

  2. Java之泛型

    1. 概述          在引入泛型之前,Java类型分为原始类型.复杂类型,其中复杂类型分为数组和类.引入泛型后,一个复杂类型就可以在细分成更多的类型.          例如原先的类型List ...

  3. leetcode812

    class Solution { public: double largestTriangleArea(vector<vector<int>>& points) { d ...

  4. Class.forName和ClassLoader.loadClass区别(转)

    Java中class是如何加载到JVM中的:1.class加载到JVM中有三个步骤    装载:(loading)找到class对应的字节码文件.    连接:(linking)将对应的字节码文件读入 ...

  5. html-select

    <html><head> <title>select选择标签</title> <meta charset="UTF-8"> ...

  6. python动态爬取网页

    简介 有时候,我们天真无邪的使用urllib库或Scrapy下载HTML网页时会发现,我们要提取的网页元素并不在我们下载到的HTML之中,尽管它们在浏览器里看起来唾手可得. 这说明我们想要的元素是在我 ...

  7. Python将两个数组合并成一个数组,多维数组变成一维数组

    1.extend方法 c1 = ["Red","Green","Blue"] c2 = ["Orange"," ...

  8. tomcat在linux服务器上部署应用

    连接服务器 服务器地址:xxx.xxx.xxx.xxx 用户名:xxxx 密码:xxxx 进入到服务器中的tomcat路径,关闭服务器,例如 路径:/opt/wzgcyth/apache-tomcat ...

  9. 696. Count Binary Substrings统计配对的01个数

    [抄题]: Give a string s, count the number of non-empty (contiguous) substrings that have the same numb ...

  10. 项目二:品优购 第二天 AngularJS使用 brand商品页面的增删改查

    品优购电商系统开发 第2章 品牌管理 传智播客.黑马程序员 1.前端框架AngularJS入门 1.1 AngularJS简介 AngularJS  诞生于2009年,由Misko Hevery 等人 ...