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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值