import java.util.Scanner;
public class FindOnly {
public static void main(String[] args){
//创建Scanner对象
Scanner sc = new Scanner(System.in);
//提示用户输入数组长度
System.out.print("请输入数组的长度: ");
//输入数组长度n
int n = sc.nextInt();
//创建数组
int[] a = new int[n];
//提示用户输入数组元素
System.out.print("请依次输入数组的元素:");
//使用for循环将输入的数据依次存入数组中
for(int i = 0; i < a.length; i++){
a[i] = sc.nextInt();
}
//声明result变量来存储只出现过一次的数字
int result = 0;
//法一:使用异或运算(当两个数相同为0,不同为1)
//遍历整个数组a,并对每个元素依次进行异或运算,把得到的结果存储在result中。由于其他元素都出现了两次,在异或计算时抵消了影响;
// 而只出现一次的那个元素则剩下了,在result中进行累积。最后输出result即可得到答案。
/*
for(int i = 0; i < a.length; i++){
result ^= a[i];
}
*/
// 法二:暴力解法
//在两个循环中,对于每个元素i,遍历整个数组寻找是否有与该元素不相等但是值相同的元素j。如果发现了一个相同的元素,
// 则break跳出内层循环,继续处理下一个元素i。如果内层循环结束了但是没有发现相同的元素,那么说明a[i]是只出现过一次的数字。
/*
for(int i = 0; i < a.length; i++){
for(int j = 0; j < a.length; j++){
// 判断i与j是否相同,相同,本次内层循环结束,进入下一次内层循环
if(i == j){
//特殊情况:数组长度为1时,只出现一次的元素只有一个,结束内层循环
if(i == a.length - 1){
result = a[i];
break;
}
continue;
}
// 判断不同位置的data[i]与data[j]是否相同
// 是 结束内层循环
else if (a[i] == a[j]) {
break;
}
// 不是 并且已经遍历完内层循环则打印输出结果
else if(j == a.length-1 ){
result = a[i];
}
}
}
*/
//二分查找:利用了数组已排序这个特点,通过不断缩小搜索区间来寻找目标元素。
//定义和初始化变量left(代表区间的最左边位置)、mid(代表区间的中间位置)、right(代表区间的最右边位置)
/*
int left = 0;
int right = a.length - 1;
int mid = 0;
//使用死循环不断缩小区间,直到找到目标元素才能利用break语句结束死循环
while(true){
//把不断变化的区间的中间位置赋给mid
mid = (left+right)/2;
//判断mid是否在边界位置
//mid不是在边界位置
if(mid!=0&&mid!=a.length-1){
//判断区间中间位置的元素与 左边或者右边 的元素是否相等
//mid位置元素与左右两边的元素都不相等,则说明此元素是目标元素,把此位置的元素赋给result并结束死循环
if(a[mid]!=a[mid-1]&&a[mid]!=a[mid+1]){
result = a[mid];
break;
}
//分成左右两个区间,目标元素在元素个数为奇数个的区间内
//mid位置元素与左边相等,把mid位置的元素归为左边的区间
else if (a[mid]==a[mid-1]) {
//判断左边的区间是否为偶数个元素,然后继续循环
//是则选取右边的区间为新区间
if((mid+1)%2 == 0){
left = mid+1;
}
//不是则选取左边的区间为新区间
else{
right = mid;
}
}
//mid位置元素与右边相等,把mid位置的元素归为右边的区间
else if (a[mid]==a[mid+1]) {
//判断左边的区间是否为偶数个元素,然后继续循环
//是则选取左边的区间为新区间
if((mid+1)%2 == 0){
right=mid-1;
}
//不是则选取右边的区间为新区间
else{
left=mid;
}
}
}
//mid是在边界位置,则说明此元素是目标元素,把此位置的元素赋给result并结束死循环
else{
result = a[mid];
break;
}
}
*/
//输出结果
System.out.print("只出现一次的数为:"+result);
}
}
寻找只出现一次的数字(三种解法:异或,暴力,二分)java
于 2023-07-21 21:35:54 首次发布