-
Notifications
You must be signed in to change notification settings - Fork 0
/
MoveZeroes.java
66 lines (54 loc) · 1.88 KB
/
MoveZeroes.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import org.junit.Assert;
import java.util.Arrays;
/**
* <pre>
* 一、题目:移动0
* 二、描述:给一个数组 nums 写一个函数将 0 移动到数组的最后面,非零元素保持原数组的顺序
* 三、示例:给出 nums = [0, 1, 0, 3, 12], 调用函数之后, nums = [1, 3, 12, 0, 0].
* 四、挑战:
* 1. 必须在原数组上操作
* 2. 最小化操作数
* </pre>
*/
public class MoveZeroes {
public void move(int[] nums) {
if (nums == null || nums.length == 0) {
return;
}
int length = nums.length;
for (int head = length - 1, tail = head, flag = length; head >= 0; head--) {
if (nums[head] == 0 && head == --flag) {
tail--;
continue;
}
if (nums[head] == 0) {
System.arraycopy(nums, head + 1, nums, head, tail - head);
nums[tail--] = 0;
}
}
}
public static void main(String[] args) {
MoveZeroes move = new MoveZeroes();
int[] nums;
/*功能测试*/
nums = new int[]{0, 1, 0, 3, 12};
move.move(nums);
Assert.assertTrue(Arrays.equals(new int[]{1, 3, 12, 0, 0}, nums));
nums = new int[]{3, 5, 4, 0, 0};
move.move(nums);
Assert.assertTrue(Arrays.equals(new int[]{3, 5, 4, 0, 0}, nums));
nums = new int[]{0, 0, 3, 5, 4};
move.move(nums);
Assert.assertTrue(Arrays.equals(new int[]{3, 5, 4, 0, 0}, nums));
nums = new int[]{3, 5, 4};
move.move(nums);
Assert.assertTrue(Arrays.equals(new int[]{3, 5, 4}, nums));
/*负面测试*/
nums = new int[]{};
move.move(nums);
Assert.assertTrue(Arrays.equals(new int[]{}, nums));
nums = null;
move.move(nums);
Assert.assertTrue(Arrays.equals(null, nums));
}
}