`

Bit Manipulation总结(一)

阅读更多
位运算这篇文章中已经介绍了关于位运算的一些知识,这里主要介绍leetcode中出现的有关位运算的题目。

有关找单独元素的有三道题,要求空间复杂度为O(n),空间复杂度为O(1),我们都可以通过位运算来解决。
1,Single Number
给定一个数组,每个元素都出现了两次,只有一个元素出现了一次,找出这个元素.

我们将所有的元素进行异或操作,最终的结果就是单独的元素,相同元素异或为0. 代码如下:
public class Solution {
    public int singleNumber(int[] nums) {
        int result = 0;
        for(int i = 0; i < nums.length; i++) {
            result ^= nums[i];
        }
        return result;
    }
}


2,Single Number II
给定一个数组,每个元素都出现了三次,只有一个元素出现了一次,找出这个元素。

我们将数组中每个元素都按位操作,通过一个长度为32的数组记录每个位置上1的个数,然后通过与3取余,结果就为单独的元素。代码实现如下:
public class Solution {
    public int singleNumber(int[] nums) {
        int[] digits = new int[32];
        int result = 0;
        int mask = 1;
        for(int i = 0; i < 32; i++) {
            for(int j = 0; j < nums.length; j++) {
                if((mask & (nums[j] >> i)) == 1) {
                    digits[i] ++;
                } 
            }
            result |= (digits[i] % 3) << i;
        }
        return result;
    }
}


3,Single Number III
给定一个数组,每个元素都出现了两次,有两个元素只出现了一次,找出这两个元素。

解决这道题的办法是我们将数组中所有元素进行异或操作,得到一个数字,这个数字为1的位置,代表要找的两个数在这个位置的数字不同,肯定一个为0,一个为1。我们可以取其中一个1,将数组元素依次与它位与&,结果为0的分到一组,结果为1的分到一组,这样我们可以把数组划分为两部分,这两个数分别在不同的组,具体代码实现如下:
public class Solution {
    public int[] singleNumber(int[] nums) {
        int helper = 0;
        for(int i = 0; i < nums.length; i++) {
            helper ^= nums[i];
        }
        int tell = helper & (~(helper - 1));
        int single1 = 0;
        int single2 = 0;
        for(int j = 0; j < nums.length; j++) {
            if((nums[j] & tell) == 0)
                single1 ^= nums[j];
            else
                single2 ^= nums[j];
        }
        int[] result = {single1, single2};
        return result;
    }
}


4,Missing Number
给定一个包含n个数的不含重复元素的数组,元素的范围为0....n,找出数组没有包含的那个元素。
例如:给定 nums[] = {0, 1, 3}  输出:2

将数组里的元素异或,再将结果与0....n异或,结果就是缺少的元素。代码如下:
public class Solution {
    public int missingNumber(int[] nums) {
        int result = 0;
        for(int i = 0; i < nums.length; i++) {
            result ^= i ^ nums[i];
        }
        return result ^ nums.length;
    }
}


                                          接下篇 Bit Manipulation总结(二)
分享到:
评论

相关推荐

    前端大厂最新面试题-bit-manipulation.docx

    前端大厂最新面试题-bit-manipulation.docx 本文档总结了前端大厂的最新面试题,主要集中在位运算方面的知识点。通过对题目的分析,我们可以总结出以下几个方面的知识点: 1. 位运算的基本概念 在计算机科学中,...

    Android模块里面增加JNI的方法,调用c代码

    `System.loadLibrary("bitmanipulation")`是用来加载本地库的,这里的库名"bitmanipulation"是与C/C++代码中的`.so`文件对应的部分。 接下来,使用`javah`命令生成C语言的头文件(JNI头文件)。在Android Studio的...

    ACM算法总结

    13. 对二进制的 1 个数的处理(Bit Manipulation) 对二进制的 1 个数的处理是一种常用的算法,用于处理二进制数中的某一位。该算法广泛应用于计算机科学和信息技术领域。 14. 大数求余(Modular Arithmetic) ...

    c5.rar_c51函数有哪些_reaction speed

    5. **Bit Manipulation Functions**: `bit bit_variable` 用于声明位变量,`bit_set(bit_variable)`、`bit_clear(bit_variable)` 和 `bit_toggle(bit_variable)` 用于操作位。 在描述中提到的“1时间函数举例4”...

    Mysql基础笔记总结

    - **DML(Data Manipulation Language)数据操作语言**:用于插入(`INSERT`)、更新(`UPDATE`)、删除(`DELETE`)表中的数据。 - **DQL(Data Query Language)数据查询语言**:主要用于检索数据,最常用的命令是...

    LeetCode练习答案

    ### LeetCode练习答案 #### 简介 LeetCode是一个非常受...以上总结仅为部分知识点的简述,对于每一个具体的算法问题,都有其独特的解决思路和技巧,建议深入研究每个问题的具体实现细节,以达到更好的理解和掌握。

    SQL语言总结(适用于初学者)

    SQL(Structured Query Language)语言是一种用于...通过以上这些知识点的总结,初学者可以对SQL语言有一个全面的了解。对于数据库的学习而言,了解这些基础概念和语法规则,能够为后续深入学习和实践打下坚实的基础。

    leetcode分类-leetcode:多思考,多总结

    多思考,多总结 刷题顺序参考: Array String Math Tree Backtracking Dynamic Programming LinkedList Binary Search Matrix DFS & BFS Stack & PriorityQueue Bit Manipulation Topological Sort Random Graph ...

    linux kernel 2.4-7 内核函数手册

    `set_bit`, `__set_bit`, `clear_bit`, `__change_bit`, `change_bit`, `test_and_set_bit`, `__test_and_set_bit`, `test_and_clear_bit`, `__test_and_clear_bit`, `test_and_change_bit`, `test_bit`, `find_...

    Linux核心API文档

    **find_first_zero_bit** 和 **find_next_zero_bit**:查找第一个或下一个零位。 ```c unsigned int index = find_first_zero_bit(bitmap, 32); // 查找第一个零位 index = find_next_zero_bit(bitmap, 32, index + ...

    单片机C语言源码学习参考-无线遥控应用程序与仿真.zip

    C语言中的位操作(bit manipulation)技巧在此处非常重要,学习者需要了解如何设置、读取和清除单片机寄存器中的特定位来实现数据编码与解码。 3. **中断处理**:单片机通常会利用中断来响应无线接收器接收到的数据...

    INTEL指令集

    8. **其他扩展**:还有如BMI(Bit Manipulation Instruction)、FMA(融合乘加)等指令集,分别提供了更高效的位操作和浮点运算。 了解和掌握INTEL指令集对于软件开发、系统编程和优化至关重要。开发者可以通过使用...

    Algorithms for programmers

    - **1.23 颜色的操纵(Manipulation of colors)** - 讨论了在图像处理中颜色值的操作方法。 - **1.24 2-进制逆和平方根(2-adic inverse and square root)** - 介绍了在2-进制数系下计算逆元和平方根的方法。 - ...

    leetcode题库-Leetcode-Summary:Leetcode刷题总结(Java版)——更新中

    位运算(bit_manipulation_items)   数组中出现次数超过一半的数字(More_than_half_of_the_occurrences_in_the_array.java)   二进制中1的个数(The_number_of_1s_in_binary.java)   主要元素(Main_...

    c&c++葵花宝典

    2. 位操作(Bit manipulation): - C/C++提供了丰富的位操作符,包括位与(&)、位或(|)、位非(~)、位异或(^)、左移()和右移(&gt;&gt;)等。位操作在处理硬件寄存器、执行效率优化等方面非常有用。 3. 指针和数组: - 在...

    The MIPS64 Instruction_IIA

    - **Bit Manipulation**:AND、OR、XOR等指令用于执行位操作。 #### 四、应用案例分析 假设在一个高性能计算应用中,需要频繁执行浮点数相加运算。使用MIPS64架构的处理器时,可以通过以下步骤优化性能: 1. **...

    SQL知识点汇总【完整版】

    本节课将对 SQL 的基础知识进行一个全面详细的总结,包括 SQL 语言分类、SQL SERVER 2008 数据分类、用户定义的数据类型等重要知识点。 SQL 语言分类 SQL 语言可以分为三类:DDL、DML 和 DCL。 * DDL(Data ...

    algorithm-zh

    #### 位操作(Bit Manipulation) - 包括了位运算的基本操作,例如: - 单一数字的处理(Single Number)。 - 位操作的优化(O1C)等。 以上是对文档中提到的一些基础数据结构、排序算法、编码实践等知识点的详细解释。...

    leetcode100-awesome-interview-resources:很棒的采访资源

    leetcode 100 很棒的采访资源 ...总结:如何使用Bit Manipulation轻松高效地解决问题 最受欢迎的 100 个问题LeetCode 前100 个问题主题明智 PDF 动态编程模式 竞争性编程的专业提示 用于 C++竞争性编程的快速 I/O

    算法刷题笔记leetcode/lintcode

    - Bit Manipulation(位操作) #### Part II - Coding 这部分涵盖了具体的编程题目及其解决方案,主要针对LeetCode和LintCode上的练习题。 - **String**(字符串处理) - Implement strStr(实现strStr函数) ...

Global site tag (gtag.js) - Google Analytics