数组
数组 : 有限个相同类型的变量 组成的有序(相对顺序)的集合。
//定义一个数组
int[] arr;//java中的规范
String[] strarr = {"1","2","3"};//静态初始化
String[] strArr1 = new String[4];//动态初始化
数组中重复的数字
public int findRepeatNumber(int[] nums) {
/*解法一 集合的解法 Set 使用集合存储已遍历过得数据,
新数据遍历时,判断是否在集合中存在,如果存在那就是重复*/
Set<Integer> set = new HashSet<Integer>();
for (int num : nums) {
//contains 判断当前的Set集合中是否包含当前的数据
if (set.contains(num)){
return num;
}
set.add(num);
}
return -1;
}
//解法二 对于整数类型,我们可以先排序后查找,排序后,相同数据相邻
//使用操作数组的工具类 进行排序
Arrays.sort(nums);
for (int i = 0; i < nums.length-1; i++) {
int num = nums[i];
if (num == nums[i+1]){
return num;
}
}
return -1;
/*解法三
因为长度为n的数组nums里的所有数字都在0-n-1
所以临时数组中的索引 对应所有可能出现的数字
遍历时,将出现数字 对应到临时数组的索引位置
更改元素0-1
当临时数组的元素不为0时,说明此所以位置,已经出现过元素,
也就是发现了重复*/
int[] arr = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
if (arr[nums[i]] == 0){
arr[nums[i]] = 1;
}else {
return nums[i];
}
}
return -1;
//解法四 类似解法三 但是不使用临时数组 移动交换数组内部的数据
//确保数组中的数据与其索引相同
for (int i = 0; i < nums.length; i++) {
int num = nums[i];
//如果索引正好等于元素本身 是我们期望的结果 跳过
if (num == i) continue;
//如果要交换的位置已经有期望值了 说明重复
if (nums[num] == num){
return num;
}
nums[i] = nums[num];
nums[num] = num;
i--;
}
return -1;