zoukankan      html  css  js  c++  java
  • 单独的数字——位运算

    时间限制:1000ms 内存限制:65536K

    给定一个数组 A,除了一个数出现一次之外,其余数都出现三次。找出出现一次的数。

    如:{1,2,1,2,1,2,7},找出 7

    你的算法只能是线性时间的复杂度,并且不能使用额外的空间哦~

    输入格式

    第一行输入一个数 n(1n500),代表数组的长度。

    接下来一行输入 n 个 int 范围内(21474836482147483647)的整数,表示数组 A。保证输入的数组合法。

    输出格式

    输出一个整数,表示数组中只出现一次的数。

    样例输入

    4
    0 0 0 5

    样例输出

    5

    总结:

    这个题正确的思路当然是位运算了,由题知除了一个数以外的数全部是3个则可以按位相加后对3取余来的到结果。

    例如:

    1: 0 0 0 1 
    2: 0 0 1 0 
    1: 0 0 0 1 
    2: 0 0 1 0 
    1: 0 0 0 1 
    2: 0 0 1 0 
    7: 0 1 1 1 
    ───────── 
     0 1 4 4

    0 1 4 4 每位除以3取余 得 0 1 1 1 => 7

    代码:

    #include <iostream>
    
    using namespace std;
    
    int main(){
        int sum[32], N, a;
        for(int i=0; i<32; i++){
            sum[i] = 0;
        }
        cin>>N;
        for(int i=0; i<N; i++){
            cin>>a;
            for(int j=0; j<32; j++){
                sum[j]+=a>>j&1;
                sum[j]%=3;   
            }
        }
        int ans = 0;
        for(int i=0; i<32; i++){
            ans += sum[i]<<i;
        }
        cout<<ans;
    }

    另外俗话说真正的高手用暴力就可以解决一切问题,虽然我没见过这种高手不过这道题的要求用暴力过更容易。

    代码:

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int board[505];
    
    int main(){
    	
    	int N;
    	cin>>N;
    	for(int i=0 ; i<N ; i++){
    		cin>>board[i];
    	}
    	sort(board,board+N);//排序
    	for(int i=0 ; i<N ; i++){
    		if((i-1<0 || board[i]!=board[i-1]) && (i+1>=N || board[i]!=board[i+1])){
    			cout<<board[i];
    			break;
    		}
    	}
    	
    	return 0;
    }
    

  • 相关阅读:
    命令拷屏之网络工具
    PHP 设计模式 笔记与总结(1)命名空间 与 类的自动载入
    Java实现 计蒜客 1251 仙岛求药
    Java实现 计蒜客 1251 仙岛求药
    Java实现 计蒜客 1251 仙岛求药
    Java实现 蓝桥杯 算法训练 字符串合并
    Java实现 蓝桥杯 算法训练 字符串合并
    Java实现 蓝桥杯 算法训练 字符串合并
    Java实现 LeetCode 143 重排链表
    Java实现 LeetCode 143 重排链表
  • 原文地址:https://www.cnblogs.com/vocaloid01/p/9514156.html
Copyright © 2011-2022 走看看