(1)找出重复的数

这篇博客探讨了Java中数组的初始化、输出、随机赋值以及元素交换的方法。通过示例代码展示了如何使用异或运算实现特定数值的查找,并利用辅助数组找出重复的元素。此外,还涉及到了如何在不引入额外空间的情况下找出数组中重复的数字。
摘要由CSDN通过智能技术生成

知识点:

1.

nextInt(x)会产生[0,x)范围

2. 若使用普通方式对数组进行输出:

System.out.println(arr+"\n");

会奇怪地得到,打印的内容是[I@7852e922这种地址值

想要得到有效的输出,应该使用:(当然需要import java.util.Arrays;)

System.out.println(Arrays.toString(arr));

3.数组的长度 (arr.length) 是个数,但其下标从0开始(而不是1),则最后一个下标应该是(length-1)

4.数组的交换源码:

public static void swap(int[] data,int a,int b ) {
	int temp=0;
	temp=data[a];
	data[a]=data[b];
	data[b]=temp;
}


解析:

【题设的准备工作】
    【构建数组】
int N=11;
int[] arr =new int[N];
for(int i=0;i<arr.length-1;i++)
{arr[i]=i+1;}
//arr的长度是N,也就是11
//此时的arr是[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0]

    【最后一个数】
arr[arr.length-1]=new Random().nextInt(N-1)+1;
//在范围是[0,10)+1  [1,11)内的数赋值给最后一个数 

int index =new Random().nextInt(N);//下标在[0,11)    
//再找一个随机下标    
  
    【交换】
swap(arr,index,arr.length-1);

【核心代码】
int x1=0;

for(int i=1;i<=N-1;i++)
{	x1=(x1^i);} 
//显然x1只与随机数无关,只和i相关
//x1是1到10 连续异或,为下一步备用

for(int i=0;i<N;i++)
{	x1=x1^arr[i];}
// 而arr=(1到10 +多余的数)
//实现[1到10的连续异或]^[1到10的连续异或^多余的数] 
 
System.out.println(x1);

考虑题目的话将N改为1001即可

若不考虑题设,引入辅助空间

//出辅助空间
int [] helper =new int [N];

for(int i=0;i<N;i++)
{	helper[arr[i]]++;}
//arr[i]里面是1到1000的计数,把数放作下标,下标放作helper中去,对计数进行加

for(int i=0;i<N;i++)
{
	if(helper[i]==2)
	{
		System.out.println(i);
		break;
	}
}
//计数等于2,就打印i

完整代码:

无辅助空间

import java.util.Arrays;
import java.util.Random;

public class a{
	public static void  main(String[] args) {
		int N =11;
		int[] arr=new int[N];
		for(int i=0;i<arr.length-1;i++) { arr[i]=i+1;}
		arr[arr.length-1]=new Random().nextInt(N-1)+1;
		int index =new Random().nextInt(N);
		swap(arr,index,arr.length-1);
		System.out.println(Arrays.toString(arr));
		
		int x1=0;
		int x2=0;
		for(int i=0;i<=N-1;i++) {
			x1=x1^i;
		}
		System.out.print("测试一"+x1+" ");

		for(int i=0;i<N;i++) {
			x1=x1^arr[i];
			x2=x2^arr[i];
		}
		System.out.println("测试二"+x1+"\n");

	}
	
	public static void swap(int[] data,int a,int b ) {
		int temp=0;
		temp=data[a];
		data[a]=data[b];
		data[b]=temp;
	}	
	
}
import java.util.Random;
public class a
{
	public static void main(String[] args) {
		int N=11;
		int[] arr =new int[N];
		for(int i=0;i<arr.length-1;i++)
		{
			arr[i]=i+1;
		}
		arr[arr.length-1]=new Random().nextInt(N-1)+1;//[0,10)+1
		int index =new Random().nextInt(N);//[0,11)
		swap(arr,index,arr.length-1);
		for(int i=0;i<arr.length;i++)
		{
			System.out.print(arr[i]+" ");
		}
		int [] helper =new int [N];
		for(int i=0;i<N;i++)
		{
			helper[arr[i]]++;
		}
		for(int i=0;i<N;i++)
		{
			if(helper[i]==2)
			{
				System.out.println(i);
				break;
			}
		}
	}
	public static void swap(int[] data, int a, int b) {
 		int temp;
 		temp = data[a]; data[a] = data[b]; data[b] = temp;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值