第三个:采用和2同样的算法,用c实现。通过 (这个题还要思考怎么用java实现)
#include<stdio.h>
int main()
{
int n,t;
int result = 0;
while(scanf("%d",&n)!=EOF && n!=0 ){
result = 0;
while(n--){
scanf("%d",&t);
result ^= t;
}
printf("%d\n",result);
}
return 0;
}
关于异或:
位异或的运算法则:
1、a^b = b^a
2、(a^b)^c = a^(b^c)
3、a^b^a = b。
对于一个任意一个数n:
1、0^n = n。
2、n^n = 0。
不断的位异或运算,剩下的就是出现奇数次的那个数
异或的另一种作用:
#include<stdio.h>
int main()
{
int a,b;
while(scanf("%d%d",&a,&b) != EOF)
{
a ^=b;
b ^=a;
a ^=b;
printf("%d %d\n",a,b);
}
return 0;
}
第一个是一个正确的算法,但是time limit exceed。
import java.util.Scanner;
public class Main {
public static int N=1000000;
public static void main(String[] args) {
int [] a=new int[N];
int n;
int ans=-2;
Scanner in = new Scanner(System.in);
n= in.nextInt();
while(n!=0){
for(int i=0;i<n;i++){
a[i] = in.nextInt();
}
sort(a,n);
int t=-1;
int i;
for(i=0;i<n-1;i++){
if(a[i]!=t && a[i]!=a[i+1]){
ans = a[i];
break;
}
t=a[i];
}
if(i==n-1){
ans = a[n-1];
}
System.out.println(ans);
n= in.nextInt();
}
}
public static void sort(int[] a,int n){
for(int i=0;i<n;i++)
for(int j = 0; j<n-1-i;j++){
if(a[j]>a[j+1]){
//交换
int t = a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
第二个:使用异或来解决问题。但下面的这个程序 time limit exceed
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int n;
int ans=0;
Scanner in = new Scanner(System.in);
n= in.nextInt();
while(n!=0){
ans = 0;
for(int i=0;i<n;i++){
ans ^=in.nextInt();
}
System.out.println(ans);
n= in.nextInt();
}
}
}
总结: java在解决某一些问题上,效率太低。但是statics里面有人解决了用java,目前还没找出方案。求大神指点