Middle-题目2:260. Single Number III

题目原文:
Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.
题目大意:
给一个数组,里面有两个元素只出现了一次,而其他数都出现了两次,找出这两个元素。
题目分析:
这道题是Middle-题目1的变形。
朴素解法:
用HashSet存储每一个元素,如果元素存在于集合内就remove掉,否则add进集合内,这样遍历完一个数组就set里面只剩下两个元素。
使用位运算的解法:
设两个单独的数是a和b,先把所有数都异或起来,得到a⊕b,记这个数是r,而因为a≠b,所以r≠0,r对应的二进制数一定有1。再令mask=r∧¬(r-1),得到一个比特串,mask串一定只有一位是1,其他位都是0,这个1即是r中最低位的1.既然这一位为1,说明a和b中对应位必然一个是0一个是1。再遍历一遍这个数组,把每个数和mask求一次与,再分别异或起来,这就得到了a和b。(因为相当于分成mask所在位为0和1的两个子数组,把这两个子数组都异或起来自然得到了a和b。)
源码:(language:java)
朴素解法:

public class Solution {
    public int[] singleNumber(int[] nums) {
        HashSet<Integer> set=new HashSet<Integer>();
        for(int num:nums) {
            if(set.contains(num))
                set.remove(num);
            else
                set.add(num);               
        }
        int[] array=new int[2];
        int i=0;
        for(int num:set)
            array[i++]=num;

        return array;


    }
}

位运算解法:

public class Solution {
    public int[] singleNumber(int[] nums) {
        int[] res = new int[2];
        int r = 0;
        for(int i=0;i<nums.length;i++) {
            r = r^nums[i];
        }
        res[0] = 0;
        res[1] = 0;
        int mask = r & (~(r-1));
        for(int i=0;i<nums.length;i++){
            if((mask & nums[i])!=0){
                res[0] = res[0] ^ nums[i];
            }else {
                res[1] = res[1] ^ nums[i];
            }
        }
        return res;
    }
}

成绩:
朴素解法:12ms,beats 14.33%,众数2ms,62.30%
位运算解法:2ms,beats 37.32%

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一段 CSS 样式表中的代码,定义了一种名为 `hvr-grow-shadow` 的样式类,它包含了两个 CSS 选择器:`.hvr-grow-shadow` 和 `.hvr-grow-shadow:hover, .hvr-grow-shadow:focus, .hvr-grow-shadow:active`。 在 `.hvr-grow-shadow` 选择器中,定义了以下样式: - `display: inline-block;` 表示将元素设置为内联块元素,使其可以像文本一样在一行内显示。 - `vertical-align: middle;` 表示将元素垂直居中对齐。 - `-webkit-transform: perspective(1px) translateZ(0);` 和 `transform: perspective(1px) translateZ(0);` 表示开启 3D 变换,并将元素转换为透视视角,以便后续的变换效果更加明显。 - `box-shadow: 0 0 1px rgba(0, 0, 0, 0);` 表示设置元素的阴影效果,此处的阴影为透明的,即不显示任何阴影。 - `-webkit-transition-duration: 0.3s;` 和 `transition-duration: 0.3s;` 表示设置过渡动画的持续时间为 0.3 秒。 - `-webkit-transition-property: box-shadow, transform;` 和 `transition-property: box-shadow, transform;` 表示设置过渡动画的属性为 `box-shadow` 和 `transform`,即在这两个属性上应用过渡动画效果。 在 `.hvr-grow-shadow:hover, .hvr-grow-shadow:focus, .hvr-grow-shadow:active` 选择器中,定义了以下样式: - `box-shadow: 0 10px 10px -10px rgba(0, 0, 0, 0.5);` 表示将元素的阴影效果设置为有颜色有模糊的效果,即在元素下方产生一个阴影,并且阴影颜色为黑色,透明度为 0.5。 - `-webkit-transform: scale(1.1);` 和 `transform: scale(1.1);` 表示将元素放大到原来的 1.1 倍,以增强交互效果。 这些样式可以应用于 HTML 元素中,并且当鼠标悬停在元素上、元素获得焦点或元素被激活时,会触发相应的过渡动画效果,使元素更加具有交互性和动态感。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值