位运算,二进制,异或的一些算法题

好记性不如烂笔头
一,异或用法:
1.不借用变量前提,交换两数值?

a = a ^ b;
b = a ^ b;
a = a ^ b;

2.数组中只有一个数出现奇数次,其余数都出现了偶数次,怎么找到这个数?

public static int findOne(int[] arr){
    int a = 0;
    for(int i=0;i<arr.length;i++){
        a ^= arr[i];
    }
    return a;
}

3.提供有一个int数,提取其最右侧第一个1 (a&(~a+1))
记住定律 a&(-a) 结果是右侧第一个数为1,其余为0的数(二进制)
4.一个数组有两个数出现奇数次,其他都出现偶数次,求这两个数(需要需用2,3的结论)

//假设a,b为这两个奇数次数,原理就是先异或,求出结果eor = a^b
//可以得出结论eor必定不为0,说明二进制位必定有一位为1
//找到最右侧1的位rightOne利用3.的知识点
//可以得出结论a,b必定分属两个阵营,如果a的rightOne为1,那么b的肯定为0
//同理剩余的出现的偶数次的数他们也可以被分成这两个阵营
//再利用a去异或自己阵营的这些偶数次的数可以得到a=eor`,b则等于eor^eor`
public static void findTwo(int[] arr){
    int eor = 0;  //eor其实就是a^b
    for(int i=0;i< arr.length;i++){
        eor ^=arr[i];
    }
    int rightOne = eor&(-eor);
    int onlyOne = 0 ; //eor'
    for(int i=0;i<arr.length;i++){
        if((arr[i]&rightOne)!=0){  //说明arr[i]和rightOne的1重叠到了,就可以划出阵营
            onlyOne ^= arr[i];
        }
    }
    System.out.println("一个是"+onlyOne+"另一个是"+(onlyOne^eor));
}

5.一个数组中有一个数出现了K次,其他数出现了M次,已知M>1,K<M,求出出现K次的数的值,要求空间复杂度O(1),时间复杂度O(n)

/**
 解题思路:整型数int是32位字节的,我们开辟一个长度为32的数组,里面暂时全放0
 然后将出先K次的数二进制上出现了1的位置加到数组里面,同理M也将二进制位出现了1的数加到数组
 最后出现的数组可能就类似[...a],假设数组最后一位等于a,说明a的组成成分可能有K也可能有M
 如果有K,那么用a%M则必不可能=0,同理,如果a%M=0说明此处K的二进制位0,
 则我们就可以根据求余%运算推导出最后的k的二进制表示从而算出K为多少
 */
public static void findK(int[] arr,int k,int m){
    int[] a = new int[32];    //定义32位的数组
    for(int num : arr){               
        for (int i = 0; i < 32; i++) {         //这个是常数次循环,所以是O(1)
            if(((num>>i)&1)!=0){           //这里((num>>i)&1)!=0说明num第i位上的数是1
                a[i]++;                    //可以写成a[i]+=((num>>i)&1),就不需要if语句
            }
        }
    }
        int answer = 0;                 //结果值
        for(int i=0;i<32;i++){ 
            if(a[i]%m!=0){             //求余,如果不等于0说明此处K有1
                answer |=(1<<i);         //则将1左移i位平且和answer做或运算,并且并入answer中
            }                            //循环32次结束后,1都填上后就是k的二进制值表示方法
        }
        System.out.println(answer);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容