数组练习
在面试中,数组类型的算法很常见,为了能在面试中能熟练不紧张的解决问题,在这里列举两个数组的典型问题,并且给出解决问题,希望能帮助到大家。
折半查找
target:8
array:0 0 1 2 2 3 5 5 8 12 22 34
折半查找(二分法):对一组有序的数进行查询,具体的查询过程,通过对比目标数与中间数的大小
使用二分法之前要把数组进行排序
创建一个类binarySearch用于二分法查找实现
定义类Array数组
public class Array{
public int binarySearch(){}
public void main(){}
}
定义一个方法实现二分法定义一个数组形参,用于传入要使用的数组,定义要查找的目标数组。
public int binarySearch(int[] arr,int target){
//确定搜索范围(起始查询位置,结束位置)
int start = 0;
int end = arr.length - 1;
//初始化目标数位置
int index = -1;
while(start <= end){
//获取中间数索引
int mid = (start + end) / 2;
//判断目标数与中间数的大小
if(target > arr[mid]){
start = mid + 1;
}else if(target < arr[mid]){
end = mid - 1;
}else{
index = mid;
break;
}
}
return index;
}
主方法的实现
public static void main(String[] args) {
int[] arr = {0 ,0 ,1 ,2 ,2 ,3 ,5 ,5 ,8 ,12 ,22 ,34};//初始数组需为排列好顺序的数组
int target = 8;//定义目标数字为8
int index = new Array().binarySearch(arr, target);//把目标数组和目标数字传入到方法中实现
System.out.println(target+"所在的位置:"+index);//输出目标数字所在位置
}
约瑟夫环
500个人围城一个圈,从1开始报数,每数到3的倍数的人离开圈子,循环往复直到最后圈中只剩下一人为止,求剩下的人原来在圈中的位置(约瑟夫环)
public class Joseph {
public static void main(String[] args) {
//声明长度为500数组,也可以在这里改变数组中的人数,即改变圈中人数
boolean[] b = new boolean[500];
//将数组中的元素全部设置为true,表示初始状态人都在圈中
for(int i = 0;i<b.length;i++){
b[i] = true;
}
//计数器,统计当前报数的位置
int count = 0;
//初始化圈中总人数
int len = b.length;
//初始化数组的索引
int index = 0;
//开始循环报数
while(len > 1){
//判断当前索引处的人是否在圈中
if(b[index]){
//报数
count++;
//判断是否到达3的倍数
if(count == 3){
//计数器归零
count = 0;
//剩余人数减一
len--;
//将状态标记为离开(false)
b[index] = false;
}
}
//数组的索引递增
index++;
//如果数完一圈,则索引归零,这里很重要
if(index == b.length){
index = 0;
}
}
//遍历判断圈中剩余的最后一个为true的元素原来的索引即为剩下的人
for(int i = 0;i<b.length;i++){
if(b[i]){
System.out.println("剩余的人原来的位置:"+i);
break;
}
}
}
}