数组(Array):
是由相同类型的元素(element)集合组成的固定长度(Size)的一种数据结构。在内存中是连续存储的
可以通过索引(Index)计算出某个元素的地址。
下面直接上算法题
例题一:找出数组中重复的数字。
题目描述:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
- 思路一:使用集合存储已经遍历的数据 Java中Set集合的特性是保存的数据是不可重复的,将数组中的元素放入Set中,当Set集合中包含数组元素时,说明这个元素时重复的
public static int findRepeatNumber(int[] nums) {
Set<Integer> set=new HashSet<>();
for(int num:nums){
if(set.contains(num)){
return num;
}
set.add(num);
}
return -1;
}
- 思路二:先排序,后查找 先对数组进行排序,要寻找排序后的数组是否有重复元素,只要判断一个元素与这个元素之前或之后的元素是否相等即可
public static int findRepeatNumber(int[] nums) {
Arrays.sort(nums);
for(int i=1;i<nums.length;i++){
if(nums[i]==nums[i-1]){
return nums[i];
}
}
return -1;
}
- 思路三:临时数组 审题:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内
设置一个全为0长度为n的数组,将原数组中的元素数值与索引相对应,有这个数则将新数组的0设为1
原数组:2,3,1,0,2,3,5
新数组:0,0,0,0,0,0,0
当遍历到原数组第一个元素2时
将新数组设为 0,0,1,0,0,0,0
依此类推
public static int findRepeatNumber(int[] nums) {
int[] temp=new int[nums.length];
for(int i=0;i<nums.length;i++){
int num=nums[i];
if(temp[num]!=0){
return num;
}
temp[num]=1;
}
return -1;
}
例题二:找出数组中只出现一次的数
题目描述:给定一个整型数组 arr 和一个整数 k(k>1)。 已知 arr 中只有 1 个数出现一次,其他的数都出现 k 次。 请返回只出现了 1 次的数。
k-1表示的是相同数的最后一个
public int foundOnceNumber (int[] arr, int k) {
Arrays.sort(arr);
for(int i=0;i<arr.length-1;i++){
if(arr[i]==arr[i+1]){
i+=k-1;
}else {
return arr[i];
}
}
return arr[arr.length-1];
}
例题三:二维数组中的查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
public boolean Find(int target, int [][] array) {
int i = array.length-1;
int j = 0;
while(i>=0&&j<array[0].length){
if(array[i][j]>target){
i--;
}else if(array[i][j]<target){
j++;
}else{
return true;
}
}
return false;
}
例题四:调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路:遍历两次数组,第一次只添加奇数到新数组里,第二次只添加奇数到新数组里
public int[] reOrderArray (int[] array) {
int index = 0;
int[] res = new int[array.length];
for (int i : array) {
if (i % 2 != 0) {
res[index] = i;
index++;
}
}
for (int i : array) {
if (i % 2 == 0) {
res[index] = i;
index++;
}
}
return res;
}