力扣刷题系列——位运算篇

2023-11-08

目录

几道常见的位运算算法题

1.不用加号的加法

2.最大单词长度乘积

3.比特位计数

4.整数替换

5.每个元音包含偶数次的最长子字符串

6.绘制直线

7.只出现一次的数字III

8.颠倒二进制位

9.两数相除

几道常见的位运算算法题

以下均为接触的力扣原题,作一个总结,以便日后复习。

1.不用加号的加法

设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。

示例:

输入: a = 1, b = 1
输出: 2

提示:

  1)a, b 均可能是负数或 0
  2)结果不会溢出 32 位整数

关键点:

  • 1、 a^b 计算没有进位的加法结果
  • 2、 a&b 计算所有进位的位,左移再亦或就是进一位的结果,以此类推

代码实现:

class Solution {
    public int add(int a, int b) {
        while(b!=0){
            int res = (a^b);
            int num = (a&b)<<1;
            a = res;
            b = num;
        }
        return a;
    }
}

2.最大单词长度乘积

给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。

示例 1:

输入: ["abcw","baz","foo","bar","xtfn","abcdef"]
输出: 16 
解释: 这两个单词为 "abcw", "xtfn"。
示例 2:

输入: ["a","ab","abc","d","cd","bcd","abcd"]
输出: 4 
解释: 这两个单词为 "ab", "cd"。
示例 3:

输入: ["a","aa","aaa","aaaa"]
输出: 0 
解释: 不存在这样的两个单词。

算法思路:

用二进制的一位表示某一个字母是否出现过,0表示没出现,1表示出现。"abcd"二进制表示00000000 00000000 00000000 00001111、"bc"二进制表示00000000 00000000 00000000 00000110。当两个字符串没有相同的字母时,二进制数与的结果为0。

代码实现:

class Solution {
    public int maxProduct(String[] words) {
        int wlength = words.length;
        int[] arr = new int[wlength];
        for(int i = 0; i < wlength; ++i){
            int length = words[i].length();
            for(int j = 0; j < length; ++j){
                arr[i] |= 1 << (words[i].charAt(j) - 'a');
            }
        }
        int ans = 0;
        for(int i = 0; i < wlength; ++i){
            for(int j = i + 1; j < wlength; ++j){
                if((arr[i] & arr[j]) == 0){
                    int k = words[i].length() * words[j].length();
                    ans = ans < k ? k : ans;
                }
            }
        }
        return ans;
    }
}

3.比特位计数

给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。

示例 1:

输入: 2
输出: [0,1,1]
示例 2:

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

代码实现:

// class Solution {
//     public int[] countBits(int num) {
//         int[] res = new int[num+1];
//         res[0] = 0;
//         for(int i=1;i<num+1;i++){
//             int n = i;
//             int count = 0;
//             while(n>0){
//                 if((n & 1)!=0){
//                     count++;
//                 }
//                 n = n>>1;
//             }
//             res[i] = count;
//         }
//         return res;
//     }
// }
/**找规律,归纳出递归表达式
观察x和 x′=x/2的关系:
x=(1001011101)2=(605)10​
x′=(100101110)2=(302)10​
可以发现 x′与 x只有一位不同,这是因为x′可以看做 x移除最低有效位的结果。
这样,我们就有了下面的状态转移函数:
P(x)=P(x/2)+(xmod  2)
*/
class Solution{
    public int[] countBits(int num){
        int[] res = new int[num+1];
        res[0] = 0;
        for(int i=1;i<num+1;i++){
            res[i] = res[i>>1]+(i&1);// x / 2 is x >> 1 and x % 2 is x & 1
        }
        return res;
    }
}

4.整数替换

给定一个正整数 n,你可以做如下操作:

1. 如果 n 是偶数,则用 n / 2替换 n。
2. 如果 n 是奇数,则可以用 n + 1或n - 1替换 n。
n 变为 1 所需的最小替换次数是多少?

示例 1:

输入:
8

输出:
3

解释:
8 -> 4 -> 2 -> 1
示例 2:

输入:
7

输出:
4

解释:
7 -> 8 -> 4 -> 2 -> 1

7 -> 6 -> 3 -> 2 -> 1

代码实现:

// 1、偶数没有任何疑问,无符号右移即可。
// 2、奇数时的两个选择,其实有迹可循:
// 例子:101111 - - > (110000 or 101110)?
// 首先明白,使用n + 1或n - 1 替代 n 都会计一步,可以理解为“转化1代价”,那么最舒适的情况当然是1越少越好(1000000[注:为偶数]),一路右移通畅无阻。如例子中所示,此时选择 n + 1 一次可以处理掉 (4 - 1 = )3 个 1,而选择n - 1稍后仍然要在其他的3 个 1 上消耗时间。显而易见前者是更高效的。
// 但这里要注意两个特殊的情况:
// 3的特殊性:按照上面偶数的处理方式 n + 1 和 n - 1都会消耗掉一个 1 ,但 n + 1 方式下路线为:3 - > 4 - > 2 - > 1,n - 1 方式下路线为3 - > 2 - > 1;所以将此时的累计值直接加二处理掉即可。
// Integer.MAX_VALUE(2147483647)溢出兼容
// Integer.MAX_VALUE会被算法使用奇数处理逻辑 +1 导致溢出为Integer.MIN_VALUE(0x80000000),此时做31次无符号右移即可得到1,这也是选用无符号右移的原因。
class Solution {
    public int integerReplacement(int n) {
        int count = 0;
        while (n!=1){
            //与运算判断最后一位来区分奇偶
            if((n & 1) == 0){
                //偶数直接无符号右移,
                //2147483647 会被奇数处理算法加一溢出为负数,
                //若选用带符号右移将无法回到1.
                n >>>=1;
                count++;
            }
            else {
                //识别奇数的上一位是否为1,即 以 10 结尾(xxxx01)还是以11结尾(xxxx11)
                if((n & 2) == 0){
                    //01结尾最优则应当 用 n -1 取代 n
                    n -= 1;
                    count++;
                }else {
                    //11结尾除3这个特殊情况外,其余选用 n + 1取代 n,原因如上
                    if(n == 3){
                        //3的特殊性处理,原因如上
                        count+=2;break;
                    }else {
                        n += 1;
                    }
                    count++;
                }
            }
        }
        return count;
    }
}

5.每个元音包含偶数次的最长子字符串

给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 'a','e','i','o','u' ,在子字符串中都恰好出现了偶数次。

示例 1:

输入:s = "eleetminicoworoep"
输出:13
解释:最长子字符串是 "leetminicowor" ,它包含 e,i,o 各 2 个,以及 0 个 a,u 。
示例 2:

输入:s = "leetcodeisgreat"
输出:5
解释:最长子字符串是 "leetc" ,其中包含 2 个 e 。
示例 3:

输入:s = "bcbcbc"
输出:6
解释:这个示例中,字符串 "bcbcbc" 本身就是最长的,因为所有的元音 a,e,i,o,u 都出现了 0 次。

原题链接https://leetcode-cn.com/problems/find-the-longest-substring-containing-vowels-in-even-counts/

代码实现:

class Solution {
    public int findTheLongestSubstring(String s) {
        int res = 0;
        char[] c = s.toCharArray();
        // Key为前i项的前缀和,value为i
        HashMap<Integer,Integer> map = new HashMap<>();
        int[] dp = new int[c.length+1];
        dp[0] = 0;
        for(int i = 0; i < c.length; i++) {
            // 当遇到元音时进行异或运算,两个相同字母异或运算为0
            if( c[i] == 'a' ||
                c[i] == 'e' ||
                c[i] == 'i' ||
                c[i] == 'o' ||
                c[i] == 'u')
                dp[i+1] = dp[i] ^ c[i];
            // 如果遇到非元音字母则保持前项结果
            else
                dp[i+1] = dp[i];
            // 如果前项和为0,则说明此字串为满足题意要求的子串
            if (dp[i+1] == 0) {
                res = i + 1;
                continue;
            }
            //dp[i+1]!=0时执行以下操作
            // 如果当前map中存在当前的前缀和,则当前前缀和与前部前缀和异或运算也为0
            if(map.containsKey(dp[i+1])) {//map中key存放的是前缀和,而不是具体的字母
                res = Math.max(res,i - map.get(dp[i+1]));
            }
            // 若不含当前字串前缀和,将其前缀和作为key,i作为value加入map中
            else
                map.put(dp[i+1],i);
        }
        return res;
    }
}

6.绘制直线

绘制直线。有个单色屏幕存储在一个一维数组中,使得32个连续像素可以存放在一个 int 里。屏幕宽度为w,且w可被32整除(即一个 int 不会分布在两行上),屏幕高度可由数组长度及屏幕宽度推算得出。请实现一个函数,绘制从点(x1, y)到点(x2, y)的水平线。

给出数组的长度 length,宽度 w(以比特为单位)、直线开始位置 x1(比特为单位)、直线结束位置 x2(比特为单位)、直线所在行数 y。返回绘制过后的数组。

示例1:

 输入:length = 1, w = 32, x1 = 30, x2 = 31, y = 0
 输出:[3]
 说明:在第0行的第30位到第31为画一条直线,屏幕表示为[0b000000000000000000000000000000011]
示例2:

 输入:length = 3, w = 96, x1 = 0, x2 = 95, y = 0
 输出:[-1, -1, -1]

审题:

解题思路:

代码实现:

//https://leetcode-cn.com/problems/draw-line-lcci/solution/javawei-yun-suan-by-loser-11/
class Solution {
    public int[] drawLine(int length, int w, int x1, int x2, int y) {
        int[] ret = new int[length];
        // 注意根据所在行数计算偏移量
        int offset = y * w / 32;
        // 首位数字下标
        int head = x1 / 32 + offset;
        // 末位数字下标
        int rear = x2 / 32 + offset;
        // 把涉及到的数全部置 -1 也就是 0b11111111111111111111111111111111
        for (int i = head; i <= rear; i++)
            ret[i] = -1;
        // 调整首位数字,先求余再移位运算再求与
        ret[head] = ret[head] & -1 >>> x1 % 32;
        // 调整末位数字,Integer.MIN_VALUE==1000..00(31个0),有符号右移,是负数所以添1
        ret[rear] = ret[rear] & Integer.MIN_VALUE >> x2 % 32;
        return ret;
    }
}

7.只出现一次的数字III

(力扣260)给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。

示例 :

  • 输入: [1,2,1,3,2,5]
  • 输出: [3,5]

注意:

  • 结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。
  • 你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?

题解思路:如果我们把原数组分成两组,只出现过一次的两个数字分别在两组里边,那么问题就转换成之前的老问题了,只需要这两组里的数字各自异或,答案就出来了。

那么通过什么把数组分成两组呢?

放眼到二进制,我们要找的这两个数字是不同的,所以它俩至少有一位是不同的,所以我们可以根据这一位,把数组分成这一位都是 1 的一类和这一位都是 0 的一类,这样就把这两个数分到两组里了。

那么怎么知道那两个数字哪一位不同呢?

回到我们异或的结果,如果把数组中的所有数字异或,最后异或的结果,其实就是我们要找的两个数字的异或。而异或结果如果某一位是 1,也就意味着当前位两个数字一个是 1 ,一个是 0,也就找到了不同的一位。

思路就是上边的了,然后再考虑代码怎么写。

怎么把数字分类?

我们构造一个数,把我们要找的那两个数字二进制不同的那一位写成 1,其它位都写 0,也就是 0...0100...000 的形式。

然后把构造出来的数和数组中的数字相与,如果结果是 0,那就意味着这个数属于当前位为 0 的一类。否则的话,就意味着这个数属于当前位为 1 的一类。

代码实现:

class Solution {
    public int[] singleNumber(int[] nums) {
        int[] res = new int[2];
        int count = 0;
        int len = nums.length;
        for(int i=0;i<len;i++){
            count ^= nums[i];
        }
        int sum = 0;
        while(count!=0){
            if((count&1)==1){
                break;
            }
            sum++;
            count >>= 1;
        }
        List<Integer> list1 = new ArrayList();
        List<Integer> list2 = new ArrayList();
        for(int i=0;i<len;i++){
            if(((nums[i] >> sum) &1) == 0){
                list1.add(nums[i]);
            }else{
                list2.add(nums[i]);
            }
        }
        int r = 0;
        for(int i:list1){
            r ^= i;
        }
        res[0] = r;
        r = 0;
        for(int i:list2){
            r ^= i;
        }
        res[1] = r;
        return res;
    }
}

8.颠倒二进制位

颠倒给定的 32 位无符号整数的二进制位。

示例 1:

  • 输入: 00000010100101000001111010011100
  • 输出: 00111001011110000010100101000000

解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596, 因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。

示例 2:

  • 输入:11111111111111111111111111111101
  • 输出:10111111111111111111111111111111

解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。

  • 提示:

    请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
    在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。

代码实现:

public class Solution {
    // you need treat n as an unsigned value
    public int reverseBits(int n) {
        int ans = 0;
        for(int size=31;n!=0;n=n>>>1,size--){
            ans += (n&1) << size;
        }
        return ans;
    }
}

9.两数相除

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

示例 1:

  • 输入: dividend = 10, divisor = 3
  • 输出: 3

解释: 10/3 = truncate(3.33333..) = truncate(3) = 3
示例 2:

  • 输入: dividend = 7, divisor = -3
  • 输出: -2

解释: 7/-3 = truncate(-2.33333..) = -2

代码实现:

class Solution {
    public int divide(int dividend, int divisor) {
        if (dividend == 0) {
            return 0;
        }
        if (dividend == Integer.MIN_VALUE && divisor == -1) {
            return Integer.MAX_VALUE;
        }
        boolean negative;
        negative = (dividend ^ divisor) <0;//用异或来计算是否符号相异
        long t = Math.abs((long) dividend);
        long d= Math.abs((long) divisor);
        int result = 0;
        for (int i=31; i>=0;i--) {
            if ((t>>i)>=d) {//找出足够大的数2^n*divisor
                result+=1<<i;//将结果加上2^n
                t-=d<<i;//将被除数减去2^n*divisor
            }
        }
        return negative ? -result : result;//符号相异取反
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

力扣刷题系列——位运算篇 的相关文章

  • 无法在 Android 10 中创建目录

    我无法在 android 10 中创建目录 它可以在 android Oreo 之前的设备上运行 我尝试了两种创建文件夹的方法 Using File mkdir File f new File Environment getExternal
  • Java Try Catch Final 没有 Catch 的情况下会阻塞

    我正在审查一些新代码 该程序只有一个 try 和一个 finally 块 既然排除了 catch 块 那么如果 try 块遇到异常或任何可抛出的内容 它如何工作 它直接进入finally块吗 如果 try 块中的任何代码可以引发已检查异常
  • 使用 GWT CellTableBuilder 构建树表

    Is it possible to build a tree table like this http www sencha com examples ExamplePlace basictreegrid with the new Cell
  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • 如果在睡眠线程上调用interrupt()会发生什么?

    我有一个线程 然后run I call sleep 如果我中断这个线程会发生什么 MyThread extends Thread public void run try sleep 1000000 catch InterruptedExce
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 如果使用的 JVM 是 x86 或 x64,则以不同的方式解决 Maven 依赖关系?

    我设置了一个 Maven 存储库来托管一些 dll 但我需要我的 Maven 项目根据使用的 JVM 是 x86 还是 x64 下载不同的 dll 例如 在运行 x86 版本 JVM 的计算机上 我需要从存储库下载 ABC dll 作为依赖
  • 内存一致性 - Java 中的happens-before关系[重复]

    这个问题在这里已经有答案了 在阅读有关内存一致性错误的 Java 文档时 我发现与创建 发生 之前 关系的两个操作相关的点 当语句调用时Thread start 每个具有 与该语句发生之前的关系也有一个 与 new 执行的每个语句之间发生的
  • Java:正则表达式排除空值

    在问题中here https stackoverflow com questions 51359056 java regexp for a separated group of digits 我得到了正则表达式来匹配 1 到 99 之间的一
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • 为什么java中的for-each循环中需要声明变量

    for 每个循环的通常形式是这样的 for Foo bar bars bar doThings 但如果我想保留 bar 直到循环结束 我可以not使用 foreach 循环 Foo bar null Syntax error on toke
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • 哪个集合更适合存储多维数组中的数据?

    我有一个multi dimensional array of string 我愿意将其转换为某种集合类型 以便我可以根据自己的意愿添加 删除和插入元素 在数组中 我无法删除特定位置的元素 我需要这样的集合 我可以在其中删除特定位置的数据 也
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • Pytorch中计算自己模型的FLOPs

    转自 Pytorch中计算自己模型的FLOPs thop profile 方法 yolov5s 网络模型参数量 计算量统计 墨理学AI CSDN博客 Pytorch 用thop计算pytorch模型的FLOPs 简书 安装thop pip
  • gcc/gdb/gprof/gcov/valgrind使用

    gcc gdb gprof gcov valgrind使用 ning 发表于 2012年10月05日 23 44 Hits 796 Tag all Table of Contents gcc编译带符号 gdb 启动参数 gdb 查看结构体
  • Blender基础:几何节点修改器

    1 几何节点修改器 几何节点修改器Geometry Node Editor 本质上一种自定义修改器 2 节点的添加 添加节点 节点Node 代表一个函数 功能 演示 添加一个节点 几何数据 变换 连接端口 修改节点的参数 几何节点修改器 是
  • ssh端口转发禁用

    配置1 vi etc ssh sshd config 修改内容 AllowTcpForwarding yes GatewayPorts yes 生效 etc rc d init d sshd restart 配置2 vi etc sysct
  • react中使用useMemo和useCallback

    之前学到的memo是用来优化函数组件的重渲染问题 当传入的属性值都没变化时就不会触发组件的重渲染 否则组件就会重渲染 和类组件中的PureComponent组件是类似 useMemo功能是判断组件中的函数逻辑是否重新执行 用来优化性能 im
  • LUA中的and与or

    逻辑运算符认为false和nil是假 false 其他为真 0也是true and的优先级比or高 其它语言中的and表示两者都为真的时候 才返回为真 而只要有一个假 都返回假 lua虽不仅返回假的语义 还返回导致假的值 也就是说 a an
  • webbench 压力测试软件

    1 安装 wget http home tiscali cz cz210552 distfiles webbench 1 5 tar gz tar xzvf webbench 1 5 tar gz cd webbench 1 5 make
  • Ubuntu Linux输入法fcitx方块乱码解决设置

    Ubuntu Linux 10 04自带的输入法不是很好用 linux下的输入法和windows下的比起来还是有很大差距的 相对来说比较好的输入法我看还是fcitx还不 错 不过在Ubuntu下通过 sudo apt get install
  • java 接口返回json数据封装

    前言 首先 采用的是springboot 在controller中使用了 RestController或者 ResponseBody注解 返回的数据本身就是json格式 但是这样的json串在前后端分离使用中并不满足实际的效果 因此需要进行
  • 18. Python中的模块与包

    Hi 大家好 我是茶桁 这一段Python之旅怎么样 还算顺利吧 之前我们都学习了些什么 有基本常识 流程 函数 不同类型的数据以及一些模块对吧 并且还做了一些练习来巩固所学过的内容 那么今天 我们接着来学习模块 不过今天要学的模块和以往不
  • IPP图像处理常用函数说明

    IPP图像处理常用函数 专栏目录 说明 一 阈值处理 1 函数原型 2 计算公式 3 Threshold Val函数 1 函数原型 2 说明 4 相关参数含义 1 源图像指针和步长 2 roiSize 3 ippCmpOp 5 官网开发手册
  • mysql日期和字符串相互转化

    一 日期转字符串 1 函数 date format date format 2 例 select date format now Y m d H i S 结果 2017 10 29 14 02 54 select date format n
  • C++成员函数指针的定义与使用

    成员函数指针是相对于对象来说的 在说成员函数指针之前 先要明白普通函数指针的定义与使用 用vs先建立一个项目 名称随意 然后在源文件中声明并且定义一个函数 代码如下 include pch h include
  • uboot简介

    1 嵌入式Linux软件结构与分布 在一般情况下嵌入式Linux系统中的软件主要分为以下及部分 1 引导加载程序 其中包括内部ROM中的固化启动代码和Boot Loader两部分 而这个内部固化ROM是厂家在芯片生产时候固化的 作用基本上是
  • CUDA学习笔记(5) 原子操作

    原子操作是指 当一个线程 Thread 要对同一个显存变量依次进行 读 计算 写 的操作时 这个 读 计算 写 的操作必须连贯地执行 中间不能插入任何其他操作 举个例子 假设我们想要用GPU统计 char data 0 32 1 0 1 这
  • 数学建模—降维—主成分分析(PCA)

    清风数学建模笔记 可用python或者matlab实现 主成分分析是一种降维算法 它能将多个指标转换为少数几个主成分 这些主成分是原始变量的线性组合 且彼此之间互不相关 且能反映出原始数据的大部分信息 一般来说 当研究的问题涉及到多变量且变
  • elasticsearch 中获得 分词匹配 +(or) 全词模糊匹配 的查询结果(boolQuery)

    Override public Response selectStructuredDataList StructuredDataDTO structuredDataDTO StructuredDataTypeEnum structuredD
  • Unity3d开发中,用Visual Studio编写c#脚本代码出现无法代码补全的解决方案

    VS版本 Visual Stduio 2017 第一步 VS菜单栏 gt 工具 gt 获取工具和功能 gt 打开visual studio installer 如下图勾选unity工作负载后安装 第二步 Unity菜单栏 gt edit g
  • GPT应用开发 - langchain 初始化

    依赖安装 langchain pip install langchain or conda install langchain c conda forge 配置环境 使用langchain依赖一个或者多个模型 数据库 外部的api接口等 下
  • 力扣刷题系列——位运算篇

    目录 几道常见的位运算算法题 1 不用加号的加法 2 最大单词长度乘积 3 比特位计数 4 整数替换 5 每个元音包含偶数次的最长子字符串 6 绘制直线 7 只出现一次的数字III 8 颠倒二进制位 9 两数相除 几道常见的位运算算法题 以