首页 > 编程语言 >求连续数组中唯一重复的值-Java

求连续数组中唯一重复的值-Java

时间:2022-11-04 18:35:10浏览次数:37  
标签:arr Java 重复 length int 异或 数组 size


1-1000中放在含有1001个元素的数组中,只有唯一的一个元素重复,其他均只出现一次. 设计一个算法,将它找出来

四种方法来求解该题

数组排序法

先将数组排序,当相邻两个值相等时,则将该值输出变为所求值

异或法

涉及到算法(相同的值异或为0;0与任意值异或后值不变)
* 1-1000的值与1-1001的值异或,
* 这些数包含999对相同的数与一个包含了3个数
* 相同的数异或为0,所以999对数异或完为0,三个数其中两个数异或也为0,0与要求的数异或即可得出所求的值

标记法

通过标记来标记数组中哪个值出现了两次,之后再将标记两次的角标输出即为重复的值

求和法

参考:​​求连续数组中唯一重复的元素​​

只谈思路,程序未实现.
思路:通过将1-1001个元素相加,之后再减去1-1000的连续元素,求得的值即为所要求得重复值
import java.util.Arrays;
import java.util.Random;

/**
* 1-1000中放在含有1001个元素的数组中,只有唯一的一个元素重复,其他均只出现一次. 设计一个算法,将它找出来
*
* @author Clearlight
*
*/
public class UniqueNum {
public static void main(String[] args) {
int[] arr = specArr(1001);
SortMethod(arr);
exclusiveOrMethod(arr, arr.length);
signMethod(arr, arr.length);
}

/**
* 产生一个指定大小的数组,并且其中只包含一个重复的值
*
* @param size 数组的大小
* @return 返回一个含有重复值的随机数组
*/
public static int[] specArr(int size) {
int[] arr = new int[size];
for (int i = 0; i < arr.length; i++) {
arr[i] = i + 1;
}
// 最后一个数,是随机数
arr[arr.length - 1] = new Random().nextInt(size - 1) + 1;// (N-1)随机产生0-999之间的值,+1后为1-1000的值
// 随机下标
int index = new Random().nextInt(size);// 随机产生0-1000之间的值
System.out.println("重复的值:" + arr[arr.length - 1]);

// 将随机产生的下标的值与arr.length-1的值相交换,形成一个随机产生的特定重复的数组
int i = 0;
i = arr[index];
arr[index] = arr[arr.length - 1];
arr[arr.length - 1] = i;

return arr;
}

/**
* 第一种方法思路: 通过排序,当相邻两个值相等时,则将该值输出变为所求值
*
* @param arr 该数组中含有特定重复的一个值
*/
public static void SortMethod(int[] arr) {
Arrays.sort(arr);
for (int j = 0; j < arr.length; j++) {
if (arr[j] == arr[j + 1]) {
System.out.println(arr[j]);
break;
}
}
}

/**
* 第二种方法思路: 涉及到算法(相同的值异或为0;0与任意值异或后值不变)
* 1-1000的值与1-1001的值异或,
* 这些数包含999对相同的数与一个包含了3个数
* 相同的数异或为0,所以999对数异或完为0,三个数其中两个数异或也为0,0与要求的数异或即可得出所求的值
*
*
* @param arr 该数组中含有特定重复的一个值
* @param size 数组的大小
*/
public static void exclusiveOrMethod(int[] arr, int size) {
int x = 0;
for (int i = 1; i <= size - 1; i++) {
x = (x ^ i);
}
for (int i = 0; i < size; i++) {
x = x ^ arr[i];
}
System.out.println(x);
}

/**
* 第三个方法思路:通过标记来找出重复出现的值
*
* @param arr 该数组中含有特定重复的一个值
* @param size 数组大小
*/
public static void signMethod(int[] arr, int size) {
int[] helper = new int[size];
for (int i = 0; i < size; i++) {
helper[arr[i]]++;// 将1-1000所处出现的值所一个计数
}
for (int i = 0; i < size; i++) {
if (helper[i] == 2) {// 当其中有值出现两次即数组大小为2,输出角标即可
System.out.println(i);
break;
}
}
}
}

输出结果:

求连续数组中唯一重复的值-Java_位运算


求连续数组中唯一重复的值-Java_位运算_02


Note:​​由于重复的值为随机产生,故每次输出都不同​


标签:arr,Java,重复,length,int,异或,数组,size
From: https://blog.51cto.com/u_14233037/5824467

相关文章

  • java中\r,\n,\r\n,\n\r的区别
    java中\r,\n,\r\n,\n\r的区别文章目录​​在Java中\n,\r,\n\r,\r\n的效果​​​​java在控制台输入回车键时,是\n还是\r还是\r\n?​​​​java......
  • 数值类型的转换与强制转换-Java
    目录​​一、数值类型之间的转换​​​​二、强制类型转换​​​​2.1语法格式​​​​2.2Math.Round()​​一、数值类型之间的转换chari......
  • 代码点和代码单元的理解-Java
    摘要​​1.概念​​​​2.获取方法​​​​3.代码点与代码单元的代码示例​​1.概念代码点(codepoint):与一个编码表中的某个字符对应的代码值.在Unicode标准中,代码点采用......
  • 在C中如何去除一个数组中重复的元素
    思路:利用for循环,首先定位在数组中的第一个元素,然后和之后的元素进行比较,如果发现有与第一个元素相同的,则删除,遍历一遍之后,在定位在第二个元素,以此类推。代码如下: n为......
  • java8 函数式编程实现策略模式
    代码如下: /***java8函数式编程实现策略模式**@date2022/11/4*/publicclassFunctionStrategy{privatestaticMap<String,Function<String,Str......
  • linux 中 awk命令中数组的应用
     001、基本用法[root@pc1test4]#lsa.txt[root@pc1test4]#cata.txtabcdbeadezbcade[root@pc1test4]#awk'{printay[$2]++}'a.txt01021......
  • java正则表达式
    参考:https://www.cnblogs.com/klb561/p/10850803.html1匹配验证-验证Email是否正确publicstaticvoidmain(String[]args){//要验证的字符串Stringstr=......
  • JAVAWeb - Filter(过滤器)
    Filter:过滤器,用来过滤网站数据;处理中文乱码登录验证....过滤器的分析:我们用户在使用web浏览器访问web服务器的时候;以往的过程都是web服务器直接去寻址拿资源(servlet......
  • 【Java】数组对象转实体对象
    使用说明使用时,要留意Object数组中值的顺序,需要与目标实体类中构造方法的形参的顺序保持一致,防止出现赋值错误的情况。工具类代码/***数据类型转换工具类*@author......
  • Java web登录学习
        下面是我们另一个登录的简单测试用的jsp文件<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%><html><head><title>login.jsp......