《算法通关村——不简单的数组增删改查》
数组的创建和初始化
创建
int[] arr = new int[10];
赋值
/**
* method 1
*/
for ( int i = 0 ; i < arr.length ; i++){
arr[i] = i;
}
/**
* method 2
*/
int[] arr = new int[]{1,2,3,4,5,6,7,8};
int[] nums = {2,4,6,8,10}
添加元素
/**
* 添加一个元素
*
* @param arr 数组
* @param size 数组实际元素个数
* @param element 插入元素
* @return 返回插入位置
*/
public static int addElementSequence(int[] arr, int size, int element) {
// 如果size大于等于arr.length 内存早就爆了。
if (size >= arr.length) {
return -1;
}
// 设定插入位置初值,如果插入元素最大直接从最后接入就好
int index = size;
for (int i = 0; i < size; i++) {
if (element < arr[i]) {
index = i;
break;
}
}
for (int i = size; i > index; i--) {
arr[i] = arr[i - 1];
}
arr[index] = element;
return index;
}
/**
* 一遍遍历插入元素
*
* @param arr
* @param size
* @param element
* @return
*/
public static int addElementSequence2(int[] arr, int size, int element) {
if (size > arr.length) {
return -1;
}
int i = size;
for (; i > 0; i--) {
if (arr[i - 1] < element) {
arr[i] = element;
return i;
} else {
arr[i] = arr[i - 1];
}
if (i == 1 && arr[0] > element) {
arr[0] = element;
return i;
}
}
return i;
}
删除元素
/**
* 删除元素
* @param arr
* @param size
* @param key
* @return
*/
public static int removeByElement(int[] arr,int size,int key){
int index = -1 ;
for(int i = 0 ; i < size ; i++){
if(arr[i] == key){
index = i;
break;
}
}
if(index != -1 ){
for(int i = index + 1 ; i < size; i++){
arr[i-1] = arr[i];
}
size--;
}
return size;
}
单调数组问题
描述
判断一个给定数组是否为单调数组
直接上代码
/**
* 判断是否为有序序列
* @param nums
* @return
*/
public static boolean isMonotonic(int[]nums){
return isSorted(nums,true) || isSorted(nums,false);
}
public static boolean isSorted(int[] nums,boolean increasing){
int n = nums.length;
for(int i = 0 ; i < n-1 ; ++i){
if(increasing){
if(nums[i] > nums[i+1]){
return false;
}
}else{
if(nums[i] < nums[i+1]){
return false;
}
}
}
return true;
}
/**
* 判断是否为有序序列
* @param nums
* @return
*/
public static boolean isMonotonic1(int[] nums){
boolean inc = true,dec = true;
int n = nums.length;
for(int i = 0 ; i< n-1; i++){
if(nums[i] > nums[i+1]){
inc = false;
}
if(nums[i] < nums[i+1]){
dec = false;
}
}
return dec || inc ;
}
二分查找找元素
描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
示例:
输入:num = [1,3,5,6],target = 5
存在5,并且在索引为2的位置,所以输出2
示例:
输入:nums = [1,3,5,6], target = 2
不存在2,2插入后在索引为1的位置。
用二分法解决
public static int searchInsert(int[] nums,int target){
int n = nums.length;
int left = 0 ,right = n-1,ans = n;
while(left<=right){
int mid = ((right - left)>>1) + left ;// 这里有个一个位操作 >>1 表示右移
if(target <= nums[mid]){
ans = mid;
right = mid-1;
}else{
left = mid +1;
}
}
return ans;
}
数组合并
描述
给你两个按非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
例子1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:合并 [1,2,3] 和 [2,5,6] 的结果是 [1,2,2,3,5,6]
代码解决
public static void merge(int[] nums1 , int nums1_len,int[] nums2,int nums2_len){
int i = nums1_len + nums2_len - 1;
int len1 = nums1_len-1,len2 = nums2_len-1;
while(len1 >= 0 && len2 >= 0) {
if (nums1[len1] <= nums2[len2]) {
nums1[i--] = nums2[len2--];
} else if (nums1[len1] > nums2[len2]) {
nums1[i--] = nums1[len1--];
}
}
//假如 A或者B数组还有剩余
while(len2 != -1) nums1[i--] = nums2[len2--];
while(len1 != -1) nums1[i--] = nums1[len1--];
}
近期在自学 Java 做项目,加入了一个编程学习圈子,里面有编程学习路线和原创的项目教程,感觉非常不错。还可以 1 对 1 和大厂嘉宾交流答疑,也希望能对大家有帮助,扫 ⬇️ 二维码即可加入。
也可以点击链接:我正在「编程导航」和朋友们讨论有趣的话题,你⼀起来吧?