/* 程序问题注释开始
-
程序的版权和版本声明部分
-
Copyright © 2020,湖南工程职业技术学院信息工程学院学生
-
All rights reserved.
-
文件名称: 蓝桥杯赛题
-
作 者: 李 斌
-
完成日期: 2020 年 03月 21日
-
版 本 号: 002
-
对任务及求解方法的描述部分
-
问题描述:
1–1000这1000个数放在含有1001个元素的数组中,只有唯一的
一个元素值重复,其它均只出现一次。每个数组元素只能访问一
次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一
个算法实现? -
程序问题注释结束
*/
方法一
//异或方法
import java.util.Random;
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc=new Scanner(System.in);
//请输入数组长度
System.out.println("请输入数组长度:");
int n =sc.nextInt();
int[] array=new int[n];
//给除最后一个元素之外的元素复初值
for(int i=0;i<n-1;i++)
{
array[i]=i+1;
}
//随机抽出一个值
array[n-1]=new Random().nextInt(n-1)+1;
//随机抽出下标
int Index=new Random().nextInt(n);
//相同下标则不交换
if(array[Index]!=array[n-1])
{
//值交换
array[Index]=array[Index]+array[n-1];
array[n-1]=array[Index]-array[n-1];
array[Index]=array[Index]-array[n-1];
}
//数组原数为
for(int i=0;i<n;i++)
{
//数组输出
System.out.print(array[i]+" ");
}
System.out.println();
//存储异或值
long DuplicateValue=0,DuplicateValue1=0;
for(int i=0;i<n-1;i++)
{
DuplicateValue1^=array[i]^i+1;
}
//加入未异或的最后一个元素
DuplicateValue=DuplicateValue1^array[n-1];
//输出重复值
System.out.println("输出重复值是:"+DuplicateValue);
}
}
方法二
//取消每个数组元素只能访问次
import java.util.Random;
import java.util.Scanner;
public class Main2 {
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
//请输入数组长度
System.out.println("请输入数组长度:");
int n =sc.nextInt();
int[] array=new int[n];
//给除最后一个元素之外的元素复初值
for(int i=0;i<n-1;i++)
{
array[i]=i+1;
}
//随机抽出一个值
array[n-1]=new Random().nextInt(n-1)+1;
//随机抽出下标
int Index=new Random().nextInt(n);
if(array[Index]!=array[n-1])
{
//值交换
array[Index]=array[Index]+array[n-1];
array[n-1]=array[Index]-array[n-1];
array[Index]=array[Index]-array[n-1];
}
//数组原数为
for(int i=0;i<n;i++)
{
//输出数组
System.out.print(array[i]+" ");
}
System.out.println();
for(int i=0;i<n-1;i++)
{
int temp=0;
for(int j=i+1;j<n;j++)
{
if(array[i]==array[j])
{
//找到重复值并输出
System.out.println("输出重复值是:"+array[i]);
temp=1;
break;
}
}
//判断是否找到重复元素
if(temp==1)
{
break;
}
}
}
}
方法三
import java.util.Random;
import java.util.Scanner;
public class Main3 {
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
//请输入数组长度
System.out.println("请输入数组长度:");
int n =sc.nextInt();
int[] array=new int[n];
int[] array1=new int[n-1];
//给除最后一个元素之外的元素复初值
for(int i=0;i<n-1;i++)
{
array[i]=i+1;
}
//随机抽出一个值
array[n-1]=new Random().nextInt(n-1)+1;
//随机抽出下标
int Index=new Random().nextInt(n);
if(array[Index]!=array[n-1])
{
//值交换
array[Index]=array[Index]+array[n-1];
array[n-1]=array[Index]-array[n-1];
array[Index]=array[Index]-array[n-1];
}
//数组原数为
for(int i=0;i<n;i++)
{
//输出数组
System.out.print(array[i]+" ");
}
System.out.println();
//给array1数组赋初值
for(int i=0;i<n-1;i++)
{
array1[i]=0;
}
//记录元素出现的次数
for(int i=0;i<n;i++)
{
array1[array[i]-1]++;
}
//重复元素输出
for(int i=0;i<n;i++)
{
if(array1[i]>=2)
{
System.out.println("输出重复值是:"+array[i]);
break;
}
}
}
}
运行结果: