1. 数组
2. 数组API汇总
3. 算法练习题
1、数组
数组长度是固定的,不像集合有直接删除和插入方法。可看作是相同类型元素的集合,在内存中是一块连续内存空间。
2、数组API总结
//数组创建
int[] arr = new int[长度];
arr = {1,2,2,5};
//数组排序
Arrays.sort(arr);
//数组转集合
List list = Arrays.asList(arr);
//求长度
int n = arr.length;
//返回数组的元素以字符串形式
Arrays.toString(arr);
//数组选定范围的数据替换
Arrays.fill(数组名,起始下标,结尾下标,替换的数字为)
3、两个算法练习题
704. 二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
常见的是二分法求解,代码如下
public int search(int[] nums, int target) {
int i= 0;
int j = nums.length-1;
while(i<=j){//这里要注意"="不能少,我习惯用左开右闭
int mid = (i+j)/2;//定义中间下标
if(target>nums[mid]){//中间值与目标值比较,目标值在右边
i = mid+1;//左区间靠右缩进
}else if(target<nums[mid]){//中间值与目标值比较,目标值在左边
j = mid-1;//右区间靠左缩进
}else{
return mid;//找到目标值的下标返回
}
}
return -1;
}
针对二分法能解决的问题,可以用这个框架思考:
int solution(int[] nums,target){
if(nums.length==0){
return -1;
}
while(left<=rigth>){
int mid = left + (right-left)/2;
if(nums[mid]==target){
....找到下标,根据题目要求处理
} else if(nums[mid]>target) {//说明目标值在左边
...怎么改变让让目标值变小
} else{//说明目标值在右边
...怎么改变让让目标值变大
}
return mid;
}
}
``
27. 移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]```
编写代码如下:
public int removeElement(int[] nums, int val) {
int k = 0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=val){//如果不相等不加入原数组
nums[k++] = nums[i];
}
}
return k;//返回新数组的长度
}