【蓝桥杯】找出唯一成对的数(Java实现)


/* 程序问题注释开始

  • 程序的版权和版本声明部分

  • 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;
			}
		}
	}
}

运行结果:
运行结果

发布了46 篇原创文章 · 获赞 1 · 访问量 816

猜你喜欢

转载自blog.csdn.net/qq_46354133/article/details/105009420