Leetcode-solution
数组
1. 在一个数组里面移除指定 value,并且返回新的数组长度,要求不能新建数组
private static int removeTarget(int[] nums, int target) {
// 数组为空或长度为零
if (nums == null || nums.length == 0) {
// 返回 0
return 0;
}
// 记录新数组的长度
int j = 0;
int len = nums.length;
for (int i = 0; i < len; i++) {
// 数组当前值等于要移除的指定值
if (nums[i] == target) {
// 进入下一个循环
continue;
}
// 代码执行到这里,表明数组当前值不是要移除的指定值
// 记录 i 位置的值到 j 位置上,j++ 表示新数组长度加一
nums[j++] = nums[i];
}
return j;
}
2. 在排好序的数组里面移除重复的元素,要求不能新建数组
private static int removeSame(int[] nums) {
// 数组为空或长度为零
if (nums == null|| nums.length == 0) {
// 返回 0
return 0;
}
// 记录新数组的长度
int j = 0;
int len = nums.length;
// 数组从第二个开始遍历
for (int i = 1; i < len; i++) {
// 数组当前值不等于数组 j 位置的值
if (nums[i] != nums[j]) {
// 记录 i 位置的值到 j 位置上,++j 表示新数组长度加一
// ++ 在前表示 i 先执行加一操作
nums[++j] = nums[i];
}
}
// +1 是因为要加上数组第一个,即 j = 0 的那个
return j + 1;
}
3. 在排好序的数组里面移除重复的元素,但是可以允许最多重复两次,要求不能新建数组
允许最多重复两次,即最多还可以有一个值和当前值重复
private static int removeDuplicates(int[] nums) {
// 数组为空或长度为零
if (nums == null || nums.length == 0) {
// 返回 0
return 0;
}
// 记录新数组的长度
int j = 0;
// 记录重复的个数
int num = 0;
int len = nums.length;
for (int i = 1; i < len; i++) {
// 数组当前值等于数组 j 位置的值
if (nums[i] == nums[j]) {
// 重复个数加一
num++;
// 由题意得,重复的个数最多为 1
if (num < 2) {
// 记录 i 位置的值到 j 位置上,++j 表示新数组长度加一
nums[++j] = nums[i];
}
} else { // 数组当前值不等于数组 j 位置的值
// 记录 i 位置的值到 j 位置上,++j 表示新数组长度加一
nums[++j] = nums[i];
// 重置记录的重复个数
num = 0;
}
}
return j + 1;
}
4. 数组加一,如 [1, 2, 3] -> [1, 2, 4];[9, 9, 9] -> [1, 0, 0, 0]
private static int[] plusOne(int[] nums) {
// 数组为空或长度为零
if (nums == null || nums.length == 0) {
// 直接返回 null
return null;
}
// 定义进位值,表示数组加一
int add = 1;
// 当前位置的数加一后的值
int sum = 0;
int len = nums.length;
// 因为要执行加一操作,所以倒序遍历数组
for (int i = len - 1; i >= 0; i--) {
// 记录加一后的值
sum = nums[i] + add;
// 更新进位值(add 为 1,表示可以进位)
add = sum / 10;
// 更新数组当前位置加一后的值
nums[i] = sum % 10;
}
// 上面倒序遍历数组操作完成后,此时遍历到了数组第一个,若还可以向前进位,则需要新建数组
if (add != 0) {
// 新建数组,长度为 len + 1
int[] result = new int[len + 1];
result[0] = 1;
// 拷贝数组,从原数组的第 0 个位置开始,拷贝 len 个到新数组 [1, len] 位置
System.arraycopy(nums, 0, result, 1, len);
// 返回新数组
return result;
}
// 返回 nums
return nums;
}