现在的位置: 首页 > 综合 > 正文

数组中的几个问题

2019年02月20日 ⁄ 综合 ⁄ 共 838字 ⁄ 字号 评论关闭

一、找数组中出现一次两次三次=-=的数。。

记得去年四省赛的时候有一个题目是,给你一个数组,除了一个数出现了一次之外其他的数都出现了偶数次,让求这个数。

当时跟wjx一个队,那个tle整的。赛后听学长说用异或操作在O(n)时间内就可以处理出来。。

寒假的时候在leetcode看到一个一样的问题。。single number I 。完了还有single number II 。题目大致是给一个数组,除了一个数出现一次外其他的数都出现了三次,让在O(n)的时间内求出这个数。

明显跟一是差不多的,需要用到位运算。

大致思路是用类似I的。I当中可以用01 来代表出现奇数次和出现偶数次,这个题是出现三次,得用012来表示出现012及更多次的mod3。我们可以加一个数来表示出现几次。。

one表示出现一次,two表示出现两次,three表示出现三次。出现几次即是该位上1的个数是几。求的时候two是由one和当前数得来的,one是one和当前数得来的。three是由one和two得来的。也就是如果出现了一次并且又出现了两次,那么这一位肯定出现了三次了。然后再利用three去更新one和two,将他们清0;

最后得到的one就是出现一次的数,two就是出现两次的数。(前提条件是这堆数中只有一个数出现一次或者只有一个数出现两次,不能有既有一个数出现了一次又有另一个数出现了两次);

int main(){
    int n;
    re;
    scanf("%d",&n);
    int one=0,two=0,three=0;
    int x;
    for(int i=0;i<n;i++){
        scanf("%d",&x);
        two|=(x&one);
        one^=x;
        three=~(one&two);
        one&=three;
        two&=three;
    }
    printf("%d %d\n",one,two);
    return 0;
}

同样推广开去,要求除了一个数外其他数都出现n次的数,可以设置one two three four ……然后对应的得到的就是答案。何止一个巧字了得。

二、暂无

抱歉!评论已关闭.