题目:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
解题思路:
/*
1.定义一个count进行计数
2.遍历:
创建两个指针进行遍历
在其中一个指针遍历结束后,对count进行判断
若为1,则是要查找的数字
若不为1,进行下一轮遍历,count清零
*/
代码实现:
//只出现一次的数字
import java.util.Scanner;
class a136{
public static void main(String[] agrs){
//提示用户输入想要进行查找的几个数字
Scanner scanner=new Scanner(System.in);
System.out.print("输入想要查找数字的长度:");
int[] a=new int[scanner.nextInt()];
//给数组赋值元素
System.out.print("请输入想要查找的数字:");
for(int i=0;i<a.length;i++){
a[i]=scanner.nextInt();
}
//定义一个查找函数
int w=project(a);
if(w==-1){
System.out.println("该数字不存在");
}else{
System.out.println(a[w]);
}
}
public static int project(int[] a){
//遍历进行查找
int count=0;
for(int i=0;i<a.length;i++){
for(int j=0;j<a.length;j++){
if(a[i]==a[j]){
count++;
}
}
if(count==1){
return i;
}
count=0;
}
return -1;
}
}
核心算法
public static int project(int[] a){
//遍历进行查找
int count=0;
for(int i=0;i<a.length;i++){
for(int j=0;j<a.length;j++){
if(a[i]==a[j]){
count++;
}
}
if(count==1){
return i;
}
count=0;
}
return -1;
}
利用两个指针依次进行遍历,最终找出只出现一次的
但该代码耗时较长,不推荐
其他方法
1. 哈希表
哈希的性质:其是不包含任何重复元素的无序集合。
【利用其性质进行使用哈希方法】
因为每个重复元素最多存在两个,而重复元素的第一个添加后均被移除,而第二个均未添加成功,故此时哈希集只保留唯一且未重复的元素
时间复杂度:O(n)
空间复杂度:O(n)
public int singleNumber(int[] nums) {
//定义一个哈希表
Map<Integer, Integer> map = new HashMap<>();
//依次遍历,进行查找
for (Integer i : nums) {
//获取一个count指标,将其他数与其比较
Integer count = map.get(i);
count = count == null ? 1 : ++count;
map.put(i, count);
}
for (Integer i : map.keySet()) {
Integer count = map.get(i);
if (count == 1) {
return i;
}
}
return -1; // can't find it.
}
2. 异或
规则:
- 交换律:a ^ b ^ c <=> a ^ c ^ b
- 任何数于0异或为任何数 0 ^ n => n
- 相同的数异或为0: n ^ n => 0
【利用题目中的“其余每个元素均出现两次”,来使用异或方法】
int ans = nums[0];
if (nums.length > 1) {
for (int i = 1; i < nums.length; i++) {
ans = ans ^ nums[i];
}
}
return ans;