移动0
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
/**
* 移动零
*
* @Date 2022/3/20 14:48:24
* @Author luopeng
*/
public class MoveZeroes {
public static void main(String[] args) {
moveZeroes1(new int[]{0, 1, 0, 3, 12});
}
/**
* 将所有的非0数往左移动,移动完成后将剩下的其他数补0
* 用一个index来标识当前该将非0的数移动到数组对应的索引
* @param nums
*/
public static void moveZeroes(int[] nums) {
if (nums == null || nums.length == 0) {
return;
}
int index = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
nums[index++] = nums[i];
}
}
while (index < nums.length) {
nums[index++] = 0;
}
System.out.println(Arrays.toString(nums));
}
/**
* 交换位置,如果是0不执行操作,否则和第一个是0的数交换位置
* @param nums
*/
public static void moveZeroes1(int[] nums) {
// 定义第0个数
int start = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
// 和第一个为0的数交换位置
int temp = nums[start];
nums[start++] = nums[i];
nums[i] = temp;
}
}
System.out.println(Arrays.toString(nums));
}
}
移除元素
/**
*
* 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
* 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
* 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
*
* 作者:力扣 (LeetCode)
* 链接:https://leetcode-cn.com/leetbook/read/all-about-array/x9p1iv/
* 来源:力扣(LeetCode)
* @Date 2022/3/21 0:05:22
* @Author luopeng
*/
public class RemoveElement {
public static void main(String[] args) {
int[] nums = {3,2,2,3};
int count = removeElement(nums, 3);
System.out.println(Arrays.toString(nums) + count);
}
/**
* 思路:通过移动元素的思路来解决这个问题。
* 把所有不等于指定val的数都放到最前面,即与首位交换位置,首位++
* @param nums
* @param val
* @return
*/
public static int removeElement(int[] nums, int val) {
int start = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != val) {
int temp = nums[i];
nums[i] = nums[start];
nums[start++] = temp;
}
}
return start;
}
/**
* 反向思维
* 将所有等于val的数都放到末尾,即与末尾交换位置,末尾--
* @param nums
* @param val
* @return
*/
public static int removeElement1(int[] nums, int val) {
int end = nums.length - 1;
for (int i = nums.length - 1; i >= 0; i--) {
if (nums[i] == val) {
int temp = nums[i];
nums[i] = nums[end];
nums[end--] = temp;
}
}
return ++end;
}
}