java - 使用堆栈将零移动到末尾
问题描述
我尝试了一种蛮力的方式,我认为这肯定会奏效,但它给了我我没想到的数字。请任何建议将不胜感激。我的逻辑是我将所有 0 放在一个堆栈中,并将所有非零放在一个堆栈中。然后稍后将所有非零弹出到数组中,并将所有零弹出到数组中。我认为逻辑是有道理的。这是我的代码
class Solution {
public void moveZeroes(int[] nums) {
Stack<Integer> stack = new Stack<>();
Stack<Integer> zeroStack = new Stack<>();
int[] res = new int[nums.length];
for(int i = nums.length-1; i>=0; i--) {
if(nums[i] != 0) {
stack.push(nums[i]);
}
else{
zeroStack.push(nums[i]);
}
}
int index = 0;
while(stack.isEmpty()) {
res[index++] = stack.pop();
}
while(zeroStack.isEmpty()){
res[index++] = stack.pop();
}
for(int i = 0; i< nums.length; i++) {
nums[i] = res[i];
}
}
}
这里有什么问题?
解决方案
while (!stack.isEmpty()) {
res[index++] = stack.pop();
}
while (!zeroStack.isEmpty()) {
res[index++] = zeroStack.pop();
}
以上是您有错误的部分,我给出了正确的代码。
1. 不应该使用!stack.isEmpty()
2.stack.isEmpty()
应该使用 zeroStack 而不是再次堆叠
我的测试代码:
public static void main(String[] args) {
int[] nums = new int[]{1,0,2,0,3,0};
moveZeroes(nums);
Arrays.stream(nums).forEach(System.out::print); // 123000
}
public static void moveZeroes(int[] nums) {
Stack<Integer> stack = new Stack<>();
Stack<Integer> zeroStack = new Stack<>();
int[] res = new int[nums.length];
for (int i = nums.length - 1; i >= 0; i--) {
if (nums[i] != 0) {
stack.push(nums[i]);
} else {
zeroStack.push(nums[i]);
}
}
int index = 0;
while (!stack.isEmpty()) {
res[index++] = stack.pop();
}
while (!zeroStack.isEmpty()) {
res[index++] = zeroStack.pop();
}
for (int i = 0; i < nums.length; i++) {
nums[i] = res[i];
}
}
推荐阅读
- javascript - 使用for循环通过带有array.length的javascript数组向后循环
- node.js - Socket.io 客户端只响应一次
- react-native - 使用反应导航库反应屏幕之间的原生延迟过渡
- c# - PHP 中的 C# DateTime.MinValue 字段
- python - 计时多处理脚本
- jquery - ajax 计时器仅在每秒钟加载一次模态时工作
- html - 为什么预连接资源提示不起作用?
- r - 随机数生成,但组内通用
- r - 在 R 中创建一个函数,将字符串转换为整数,覆盖整个数据帧
- xamarin - (Xamarin Forms)不能在 Android 上使用 TEditor 版本 1.0.3 的粗体、斜体等...?