Single Number:从数组中找出只出现一次的数字

[ 问题: ]

Given an array of integers, every element appears twice except for one. Find that single one.

Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

翻译:给定一个整数数组,数组中所有元素都出现了两次,只有一个元素只出现了一次,找出这个只出现了一次的元素。

[ 解法: ]

①. 常规解法:时间复杂度为O(n),没能通过

/**
 * Time Limit Exceeded
 * 时间复杂度为:O(n),无法通过
 */
public class Solution1 {
    public int singleNumber(int[] arr) {
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                if (arr[i] == arr[j]) {
                    count++;
                }
            }
            if (count == 1) {
                return arr[i];
            } else {
                count = 0;
            }
        }
        return -1;
    }  

    public static void main(String[] args) {
        int[] arr = { 0, 1, 1, 2, 2, 3, 0 };
        System.out.println(new Solution1().singleNumber(arr));
    }
}

②. 标准解法:使用异或运算

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

这个程序用了个小技巧:一个整数和它本身异或之后得到值是0,0与其他整数异或得到的是这个整数本身

/**
 * 利用异或的可交换性
 */
public class Solution2 {
    public int singleNumber(int[] arr) {
        // invalid check
        if (arr.length == 0) {
            return -1;
        }
        int result = 0;
        for (int i = 0; i < arr.length; i++) {
            result = result ^ arr[i];
        }
        return result;
    }  

    public static void main(String[] args) {
        int[] arr = { 0, 1, 1, 2, 2, 3, 0 };
        System.out.println(new Solution2().singleNumber(arr));
    }
}

[ 拓展:]

异或运算的两个法则:

①. a ^ b = b ^ a

②. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c

真 ^  假 = 真  假 ^  真 = 真  假 ^  假 = 假  真 ^  真 = 假

/**
 * 不使用第三个变量,交换两个变量的值
 */
public class Swap {
    public static void main(String[] args) {
        int a = 1, b = 2;
        System.out.println("交换前: a = " + a + " , b = " + b);
        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
        System.out.println("交换后: a = " + a + " , b = " + b);
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数组
, int
, 异或
, 整数
, public
, arr
解法
single韩剧、single是什么意思、sing、signal、single dog,以便于您获取更多的相关知识。

时间: 2025-01-30 01:58:46

Single Number:从数组中找出只出现一次的数字的相关文章

java在已经排好的数组中找出连续的数字

问题描述 纸牌游戏,一共5张牌,怎么找出连续的牌.我知道分好几种情况,5张牌不同,组成234564张牌13456或者12347或者33456(两个3算两个连续的情况)感觉有好多种情况分析,不知道该怎么写..求高手指点 解决方案 解决方案二:看得不是很明白,只要有连续的就算连续的情况吗?那个3算两个连续是什么0.0

[华为机试练习题]43.在字符串中找出连续最长的数字串

题目 描述: 请一个在字符串中找出连续最长的数字串,并把这个串的长度返回:如果存在长度相同的连续数字串,返回最后一个连续数字串: 注意:数字串只需要是数字组成的就可以,并不要求顺序,比如数字串"1234"的长度就小于数字串"1359055",如果没有数字,则返回空字符串("")而不是NULL! 样例输入 abcd12345ed125ss123058789 abcd12345ss54761 样例输出 输出123058789,函数返回值9 输出547

如何在Linux中找出最近或今天被修改的文件

在本文中,我们将解释两个简单的命令行小技巧,它可以帮你只列出所有的今天的文件. Linux 用户在命令行上遇到的常见问题之一是定位具有特定名称的文件,如果你知道确定的文件名则可能会容易得多. 不过,假设你忘记了白天早些时候创建的文件的名称(在你包含了数百个文件的 home 文件夹中),但现在你有急用. 下面用不同的方式只列出所有你今天创建或修改的文件(直接或间接). 1. 使用 ls 命令,只列出你的 home 文件夹中今天的文件. # ls -al --time-style=+%D | gre

c++-求助:数组中找两个最大的数

问题描述 求助:数组中找两个最大的数 //算法一:依次扫描,分别找出A[x1]和A[x2] void max2_1(int A[], int lo, int hi, int &x1, int &x2) //1 < n = hi - lo { for(int i = lo + 1, x1 = lo; i < hi; i++) //扫描A[lo,hi),找出A[x1] { if(A[x1] < A[i]) x1 = i; //hi-lo-1=n-1 } int x2L = l

如何在 Linux 中找出最近或今天被修改的文件

在本文中,我们将解释两个简单的命令行小技巧,它可以帮你只列出所有的今天的文件. Linux 用户在命令行上遇到的常见问题之一是定位具有特定名称的文件,如果你知道确定的文件名则可能会容易得多. 不过,假设你忘记了白天早些时候创建的文件的名称(在你包含了数百个文件的 home 文件夹中),但现在你有急用. 下面用不同的方式只列出所有你今天创建或修改的文件(直接或间接). 1. 使用 ls 命令,只列出你的 home 文件夹中今天的文件. # ls -al --time-style=+%D | gre

date-Java 从多个日期中找出最大最小时间

问题描述 Java 从多个日期中找出最大最小时间 50C 1 a 2013-04-011 a 2013-04-081 a 2013-04-282 a 2013-04-082 a 2013-11-11求代码,实现以前两列为唯一,比较多个日期从中找出最早最晚时间,并统计出现次数1 a 2013-04-01 2013-04-28 32 a 2013-04-08 2013-11-11 2 解决方案 lz我不知道你的前两列唯一是什么意思实现的是对日期的排序统计具体的lz你在你的需求你基础上改吧 impor

python实现从一组颜色中找出与给定颜色最接近颜色的方法_python

本文实例讲述了python实现从一组颜色中找出与给定颜色最接近颜色的方法.分享给大家供大家参考.具体分析如下: 这段代码非常有用,可以找到指定颜色相似的颜色,比如有一组8个颜色,现在给定一个rgb格式的演示,找出它与8个颜色中的哪一个最接近,如果你需要做一个按照图片颜色搜索图片的程序,这个就非常有用了. 复制代码 代码如下: from colorsys import rgb_to_hsv colors = dict(( ((196, 2, 51), "RED"), ((255, 165

字符串中找出连续最长的数字字符串的实例代码_C 语言

复制代码 代码如下: //1. 写一个函数,它的原形是int continumax(char *outputstr,char *intputstr) //功能: //在字符串中找出连续最长的数字串,并把这个串的长度返回, //并把这个最长数字串付给其中一个函数参数outputstr所指内存. //例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为123456789 #include<stdio.

Java实现从字符串中找出数字字符串的方法小结_java

本文实例总结了Java实现从字符串中找出数字字符串的方法.分享给大家供大家参考,具体如下: int start = 0; String numStr = null; for (int j = 0; j < valuesStr.length() - 1; j++) { if (Character.isDigit(valuesStr.charAt(j)) == false && Character.isDigit(valuesStr.charAt(j + 1)) == true) { s