例子:
输入: {-1, 2, -1, 3, 0}
输出: 2 说明: 第一个不重复的数字是: 2输入: {9, 4, 9, 6, 7, 4}
输出: 6
方法1:双重循环,外部循环逐个选取元素,内部循环检查元素是否存在多次。
时间复杂度:O(n*n), 检查每个元素 n 次
辅助空间: O(1)
public class _test {
static int firstNonRepeating(int arr[], int n)
{
// 第一次循环遍历元素
for (int i = 0; i < n; i++) {
int j;
// 第二次循环判断数是否重复
for (j = 0; j < n; j++)
if (i != j && arr[i] == arr[j])
break;
//如果遍历完都没有重复,所以次数不重复,直接返回
if (j == n)
return arr[i];
}
return -1;
}
// Driver code
public static void main(String[] args)
{
int arr[] = { 9, 4, 9, 6, 7, 4 };
int n = arr.length;
System.out.print(firstNonRepeating(arr, n));
}
}
方法2:使用哈希表来存储每个数字出现的次数
时间复杂度:O(2n),遍历数组以映射频率,再次遍历阵列以检查频率。
辅助空间:O(n),创建用于存储频率的哈希表
import java.util.HashMap;
import java.util.Map;
public class _test {
static int firstNonRepeating(int arr[], int n)
{
//创建一个HashMap来存放元素及个数
Map<Integer, Integer> m = new HashMap<>();
for (int i = 0; i < n; i++) {
//如果HashMap中已经存放该元素,则次数+1
if (m.containsKey(arr[i])) {
m.put(arr[i], m.get(arr[i]) + 1);
}//如果该元素不在HashMap中,则第一次存入,次数为1
else {
m.put(arr[i], 1);
}
}
//遍历查找第一个次数为1的元素返回
for (int i = 0; i < n; i++)
if (m.get(arr[i]) == 1)
return arr[i];
return -1;
}
// Driver code
public static void main(String[] args)
{
int arr[] = { 9, 4, 9, 6, 7, 4 };
int n = arr.length;
System.out.println(firstNonRepeating(arr, n));
}
}