计蒜客--单独的数字 (位运算)
给定一个数组 AA,除了一个数出现一次之外,其余数都出现三次。找出出现一次的数。
如:\{1, 2, 1, 2, 1, 2, 7\}{1,2,1,2,1,2,7},找出 77。
你的算法只能是线性时间的复杂度,并且不能使用额外的空间哦~
输入格式
第一行输入一个数 n(1 \leq n \leq 500)n(1≤n≤500),代表数组的长度。
接下来一行输入 nn 个 int 范围内(-2147483648\ldots 2147483647−2147483648…2147483647)的整数,表示数组 AA。保证输入的数组合法。
输出格式
输出一个整数,表示数组中只出现一次的数。
样例输入
4 0 0 0 5
样例输出
5
题解:还是两种解法
第一种:统计出现次数大于一次就跳到下一个数字 知道另外一个数字出现次数为一
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <vector> 6 #include <cstdlib> 7 #include <iomanip> 8 #include <cmath> 9 #include <ctime> 10 #include <map> 11 #include <set> 12 #include <queue> 13 using namespace std; 14 #define lowbit(x) (x&(-x)) 15 #define max(x,y) (x>y?x:y) 16 #define min(x,y) (x<y?x:y) 17 #define MAX 100000000000000000 18 #define MOD 1000000007 19 #define pi acos(-1.0) 20 #define ei exp(1) 21 #define PI 3.141592653589793238462 22 #define INF 0x3f3f3f3f3f 23 #define mem(a) (memset(a,0,sizeof(a))) 24 typedef long long ll; 25 ll gcd(ll a,ll b){ 26 return b?gcd(b,a%b):a; 27 } 28 bool cmp(int x,int y) 29 { 30 return x>y; 31 } 32 const int N=10005; 33 const int mod=1e9+7; 34 int a[505]; 35 int main() 36 { 37 std::ios::sync_with_stdio(false); 38 int n,t; 39 cin>>n; 40 for(int i=0;i<n;i++) 41 cin>>a[i]; 42 for(int i=0;i<n;i++){ 43 t=0; 44 for(int j=0;j<n;j++){ 45 if(a[i]==a[j]) t++; 46 if(t>1) break; 47 } 48 if(t==1){ 49 cout<<a[i]<<endl; 50 return 0; 51 } 52 } 53 return 0; 54 }
第二种:位运算
由于除了一个特殊的数外,其他的数都有 3 个,使用二进制的位运算,既然其他每次数都出现3次,那么如果针对每一位求和并对3取余,那么那些出现3次的数字在这一位的和对3取余后肯定是0。如:
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
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <vector> 6 #include <cstdlib> 7 #include <iomanip> 8 #include <cmath> 9 #include <ctime> 10 #include <map> 11 #include <set> 12 #include <queue> 13 using namespace std; 14 #define lowbit(x) (x&(-x)) 15 #define max(x,y) (x>y?x:y) 16 #define min(x,y) (x<y?x:y) 17 #define MAX 100000000000000000 18 #define MOD 1000000007 19 #define pi acos(-1.0) 20 #define ei exp(1) 21 #define PI 3.141592653589793238462 22 #define INF 0x3f3f3f3f3f 23 #define mem(a) (memset(a,0,sizeof(a))) 24 typedef long long ll; 25 ll gcd(ll a,ll b){ 26 return b?gcd(b,a%b):a; 27 } 28 bool cmp(int x,int y) 29 { 30 return x>y; 31 } 32 const int N=10005; 33 const int mod=1e9+7; 34 int a[505]; 35 int main() 36 { 37 std::ios::sync_with_stdio(false); 38 int sum[32], n, a; 39 for(int i=0; i<32; i++){ 40 sum[i] = 0; 41 } 42 scanf("%d", &n); 43 for(int i=0; i<n; i++){ 44 scanf("%d", &a); 45 for(int j=0; j<32; j++){ 46 sum[j]+=a>>j&1; //取最后一位,累计求和 47 sum[j]%=3; 48 } 49 } 50 int ans = 0; 51 for(int i=0; i<32; i++){ 52 ans += sum[i]<<i; 53 } 54 printf("%d\n", ans); 55 return 0; 56 }