• LeetCode 136. 只出现一次的数字


    我的LeetCode:https://leetcode-cn.com/u/ituring/

    我的LeetCode刷题源码[GitHub]:https://github.com/izhoujie/Algorithmcii

    LeetCode 136. 只出现一次的数字

    题目

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

    说明:

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

    示例 1:

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

    示例 2:

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/single-number
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解题思路

    思路1-利用异或运算解决

    利用位运算中异或运算的特性:

    • bit位不同异或结果为1,否则为0;
    • 任意数与本身异或为0;
    • 任意数与0异或为其本身;

    一个例子,不使用额外变量,利用异或运算交换两个值:

    public static void swap(int x, int y) {
    	System.out.println("x=" + x);
    	System.out.println("y=" + y);
    	// 任意数与本身异或为0
    	int z = (x ^ x);
    	System.out.println(z == 0);
    	// 使用异或特性交换两个值
    	x = x ^ y;
    	y = x ^ y;
    	x = x ^ y;
    	System.out.println("x=" + x);
    	System.out.println("y=" + y);
    }
    

    算法复杂度:

    • 时间复杂度: $ {color{Magenta}{Omicronleft(n ight)}} $
    • 空间复杂度: $ {color{Magenta}{Omicronleft(1 ight)}} $

    算法源码示例

    package leetcode;
    
    /**
     * @author ZhouJie
     * @date 2020年5月14日 下午9:55:37 
     * @Description: 136. 只出现一次的数字
     *
     */
    public class LeetCode_0136 {
    
    }
    
    class Solution_0136 {
    	/**
    	 * @author: ZhouJie
    	 * @date: 2020年5月14日 下午9:56:09 
    	 * @param: @param nums
    	 * @param: @return
    	 * @return: int
    	 * @Description: 1-直接异或所有数,剩下的即为唯一数;
    	 *
    	 */
    	public int singleNumber(int[] nums) {
    		int number = 0;
    		for (int val : nums) {
    			number ^= val;
    		}
    		return number;
    	}
    }
    
    
  • 相关阅读:
    ros 使用笔记
    GLog 初始化说明
    面试-重写基础功能函数
    C++后台服务崩溃堆栈日志
    Linux下FTP服务器(vsftpd)配置:
    Windows 命令行解析工具(getopt)
    C/C++ 宏技巧
    Sublime Keymap 设置
    C++程序设计的技巧-Pimple的使用
    TCP的长连接与短连接
  • 原文地址:https://www.cnblogs.com/izhoujie/p/12891674.html
Copyright © 2020-2023  润新知