牛客网算法学习笔记-位运算

原创 2016年05月31日 09:17:59

请编写一个算法,不用任何额外变量交换两个整数的值。

给定一个数组num,其中包含两个值,请不用任何额外变量交换这两个值,并将交换后的数组返回。

测试样例:
[1,2]

返回:[2,1]

A^A=0, A^0 = A. A^B^A = B (因为A^A=0与位置无关)

class Swap {
public:
    vector<int> getSwap(vector<int> num) {
        // write code here
        num[0] = num[0]^num[1];
        num[1] = num[0]^num[1];
        num[0] = num[0]^num[1];
        return num;
    }
};


对于两个32位整数a和b,请设计一个算法返回a和b中较大的。但是不能用任何比较判断。若两数相同,返回任意一个。

给定两个整数ab,请返回较大的数。

测试样例:
1,2
返回:2
class Compare {
public:
    int getMax(int a, int b) {
        // write code here
        int sign1 = getSign(a);
        int sign2 = getSign(b);
        if(sign1 == sign2){ //同号
            int sign = getSign(a-b); //做差,观察结果的符号
            if(sign == 1) //符号0
                return a;
            else{ //符号1
                return b;
            }
        }
        else if (sign1 == 1){ //异号且a为正
            return a;
        }
        else{ //异号a为负
            return b;
        }
    }
    
    int getSign(int a){ //取符号
        return (a>>31)^1;
    }
};


有一个整型数组A,其中只有一个数出现了奇数次,其他的数都出现了偶数次,请打印这个数。要求时间复杂度为O(N),额外空间复杂度为O(1)。

给定整形数组A及它的大小n,请返回题目所求数字。

测试样例:
[1,2,3,2,1],5
返回:3

class OddAppearance {
public:
    int findOdd(vector<int> A, int n) {
        // write code here
        for(int i = 1 ; i<A.size();i++){
            A[0] = A[i]^A[0];
        }
        return A[0];
    }
};


给定一个整型数组arr,其中有两个数出现了奇数次,其他的数都出现了偶数次,找到这两个数。要求时间复杂度为O(N),额外空间复杂度为O(1)。

给定一个整形数组arr及它的大小n,请返回一个数组,其中两个元素为两个出现了奇数次的元素,请将他们按从小到大排列。

测试样例:
[1,2,4,4,2,1,3,5],8
返回:[3,5]
有两个数出现奇数次的情况下,对数组异或的结果为A^B,因为AB不同,所以可以按位进行与操作,找到其中一位为1的 但对于另一个数为0的情况,那么通过这一位就可以对两个数进行过滤,在第二次遍历时,只异或这位为1的数,那么可以找到其中一个数,再与之前的结果^则可以找到另一个数
class OddAppearance {
public:
    vector<int> findOdds(vector<int> arr, int n) {
        // write code here
        vector<int> rarr;
        int check1 = 0, check2 = 0, mask = 1;
        for(int i = 0; i < n; i++)
            check1 = check1 ^ arr[i];
        while(!(mask & check1))
            mask = mask<<1;
        for(int j = 0; j < n; j++){
            if(mask & arr[j])
                check2 = check2 ^ arr[j];
        }
        int res1 = check2;
        int res2 = check2 ^ check1;
         
        if(res1 >= res2)
            rarr = {res2, res1};
        else
            rarr = {res1, res2};
        return rarr;
    }
};

牛客网刷题笔记--链表

1.链表的每个结点中都恰好包含一个指针() A.正确 B.错误 答案:B。链表中的结点可含多个指针域,分别存放多个指针。例如,双向链表中的结点可以含有两个指针域,分别存放指向其直接前趋和直接后继...
  • zhuhuyou4801
  • zhuhuyou4801
  • 2017年08月02日 09:24
  • 267

牛客网算法学习记录-排序

对于一个int数组,请编写一个冒泡排序算法,对数组元素排序。 给定一个int数组A及数组的大小n,请返回排序后的数组。  测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] 升...
  • u012656267
  • u012656267
  • 2016年05月18日 15:19
  • 231

牛客网算法课系列(三):字符串

字符串广泛性 字符串可以看做字符类型的数组,与数组的排序、查找、调整有关 字符串类型转换 Java中string不可更改,可使用StringBuffer和StringBuilder类和toCha...
  • xkx_1223_xkx
  • xkx_1223_xkx
  • 2017年08月21日 09:55
  • 115

跟大家分享一下牛人常用的资源(牛客网 )!

作者:进击的喵 链接:https://www.nowcoder.com/discuss/247?type=5&order=0&pos=2&page=0 来源:牛客网 跟大家分享一下牛人常用的资源类,...
  • qq_36617521
  • qq_36617521
  • 2017年03月20日 09:39
  • 741

牛客网(直通BAT面试算法班) Day1

这个月的月初学习了一发牛客网的课程,左程云的算法课,把一些笔记和思路记录下来,以便于分享和回顾。 1,二叉树的层次打印: 有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。 给定...
  • lxt1994
  • lxt1994
  • 2017年08月25日 23:38
  • 373

优惠码:直通BAT面试算法精品课-牛客网

直通BAT面试算法精品课,视频短小精悍,切中解题的要害,还有配套练习题。 既快速掌握核心知识又能节约复习时间,况且知识面涵盖的比较广,适合找工作复习用。 如果你也对这门课感兴趣,可以使用以...
  • zengfanjie
  • zengfanjie
  • 2016年06月30日 10:41
  • 2008

牛客网算法课系列(二):排序

一、冒泡排序 每一轮相邻位置比较,判断交换与否,找到该轮最大/最小,放到相应位置,执行下一轮。 二、选择排序 每次找最大、最小放到相应位置。 三、插入排序 每次判断一个数跟前边所有...
  • xkx_1223_xkx
  • xkx_1223_xkx
  • 2017年08月18日 19:30
  • 164

牛客网-直通BAT面试算法精品课购买优惠码

已看部分视频,讲解详细,对互联网校招面试笔试算法复习很有帮助。 专属优惠码为: AigxZ1N    专属优惠购课链接:http://www.nowcoder.com/courses/1?coupon...
  • wangyongna926
  • wangyongna926
  • 2016年06月27日 16:51
  • 3615

【牛客网】链表中倒数第k个结点

题目: 输入一个链表,输出该链表中倒数第k个结点。 AC的代码: class Solution { public: ListNode* FindKthToTail(ListNode* pLi...
  • tiewadhd
  • tiewadhd
  • 2016年08月15日 16:34
  • 239

位运算在算法题中的使用(C++)

一、算术运算符和位运算符 算术运算符:+、-、*、/、% 位运算符:&按位与、|按位或、^按位异或、~按位取反、>右移左侧补符号位、 >>>右移左侧补0 注意:移位运算一定要赋值。也就是说将a左移2位...
  • DjangoBUAA
  • DjangoBUAA
  • 2016年04月20日 14:36
  • 1727
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:牛客网算法学习笔记-位运算
举报原因:
原因补充:

(最多只允许输入30个字)