数组的增删改查
这里我自己完成了一些leetcode中的增删改查题目,或者重新写了一遍
27.移除元素
这里摒弃了删除一个元素,就将后面所有元素前移的方法
left指向的位置是可能会填入值的位置的前一个位置
right指向是位置是待判断的值:如果值不等于val,则需要填入(left需要自加),否则继续后移
public int removeElement(int[] nums, int val) {
int len = nums.length;
//双指指针
int left = -1, right = 0;
while(right != nums.length) {
if(nums[right] == val) {
len--;
} else {
left++;
nums[left] = nums[right];
}
right++;
}
return len;
}
增加元素
public static int addByElementSequence(int[] arr, int size, int element) {
//判断size是否超限,数组真实长度arr.length比size要大,不需要考虑扩容
if(size >= arr.length) {
return -1;
}
//元素需要插入尾部的情况(element大于所有元素)
//不会进入第一个循环的if,index不会被修改,element应该插入arr[size]位置
int index = size;
for(int i = 0; i < size; i++) {
if(element < arr[i]) {
index = i;
break;
}
}
//元素后移
for(int j = size; j > index; j--) {
arr[j] = arr[j - 1];//index下标开始的元素后移
}
arr[index] = element;
return index;
}
896.单调数列
public boolean isMonotonic(int[] nums) {
//如果只有一两个元素,则必然单调
if(nums.length <= 2) return true;
//设置一个flag来判断是否不单调
int flag = -1;
//双指针
int left = -1, right = 0;
while(right < nums.length - 1) {
left++; right++;
if(nums[left]== nums[right]) {
continue;
} else if(nums[left] < nums[right]) {
//不单调
if(flag == 0) return false;
flag = 1;
} else if(nums[left] > nums[right]) {
//不单调
if(flag == 1) return false;
flag = 0;
}
}
return true;
}
答案,看起来很简洁,但是无论是否单调,都要全部遍历数组
public boolean isMonotonic(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 = flase;
}
if(nums[i] < nums[i + 1]) {
dec = false;
}
}
return inc || dec;
}