题目:1——1000这1000个数,放入含有1001个数组元素的数组中,只有唯一的一个值重复,其它均止出现一次。遍历数组,每个数组元素均只能访问一次,设计算法,将其找出?
异或 ^ : 相同位0 , 不同位1。 任何数与0异或就是它本身
0 ^ 0 = 0 x ^ 0 = x x ^ x = x
// C语言版
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
#define INDEX 1001 // 数组元素个数
int index; // 随机数组下标
int i ;
int repeatNumber = 0; // 重复数组元素
int arr[ INDEX] = { 0 };
srand( time ( 0 ) );
index = rand( ) % INDEX ; // 产生随机下标
for( i = 0 ; i < INDEX ;i++){
arr[ i ] = i + 1 ;
}
if( i = index){
arr[ i ] = rand( ) % ( INDEX -1 )+1 ; // 产生随机数 赋给 随机下标数组单元
}
for( i = index +1 ; i < INDEX ; i++){
arr[i] = i;
}
for( i = 0 ; i < INDEX ;i++){
printf( "%d \t" , arr[ i ]);
}
for( i = 0 ; i < INDEX ;i++){
repeatNumber = repeatNumber ^ i; // 从0 开始 异或 INDEX-
}
for( i = 0 ; i < INDEX ;i++){
repeatNumber = repeatNumber ^ arr[ i ] ; // 异或数组元素,只剩下 repeatNumber
}
printf( "\n 该数值中的重复元素为 %d ",repeatNumber );
}
// java版
public class RepeatNumber{
final static int N = 1001;
static int arr[] = new int[N];
static int index = ( int )( Math.random() * N );
public static void main(String[] args) {
int repeatNumber = 0;
for( int i = 0 ; i <N-1 ; i++) {
arr[i] = i+1;
}
arr[arr.length-1] = ( int )( Math.random() *(N-1 )+1) ;
swap( arr[arr.length-1]);
for( int i = 0 ; i <arr.length ; i++ ) {
repeatNumber = repeatNumber ^ i;
}
for( int i = 0 ; i < N ;i++){
repeatNumber = repeatNumber ^ arr[ i ] ; // 异或数组元素,只剩下 repeatNumber
}
System.out.println("该数为:"+ repeatNumber);
}
public static void swap( int number ) {
int space = 0;
space = arr[index];
arr[index] = number;
arr[arr.length-1] = space;
}
}