当前位置: 首页 > 面试题库 >

将0移到数组末尾

史谦
2023-03-14
问题内容

我需要将数组中的所有0移到数组的末尾。

示例:[1、10、0、5、7]应产生[1、10、5、7、0]。

我愿意进行反向循环或常规循环

无法 创建一个新数组。

这是我到目前为止的内容:

for (int i = arr.length; i <= 0; --i) {
    if (arr[i] != 0) {
        arr[i] = arr.length - 1;
    }
}

谢谢!


问题答案:

SIZE(n)其中n = arr.size,保留顺序:

创建一个与您要从中删除0的初始数组大小相同的数组。遍历原始数组,并将每个元素添加到新数组(如果它不为0)。遇到0时,对其进行计数。现在,当您到达第一个数组的末尾时,只需将计数的0数添加到数组的末尾即可。而且,甚至更简单,因为Java将数组初始化为0,所以您可以忘记在末尾添加零。

编辑

由于您添加了无法创建新数组的其他限制,因此我们需要采取与我上面建议的方法稍有不同的方法。

大小(1)

我认为数组需要保持与0移到末尾之前相同的顺序。如果不是这种情况,那么还有另一个简单的解决方案,如Brads答案中所述:初始化“最后零”索引到数组的最后一个元素,然后向后迭代,将任何零与每次减小的最后零的索引交换您执行交换或看到零。

SIZE(1),保留顺序:

要将0移到末尾而不复制数组并使元素保持正确的顺序,您可以完全按照我的建议进行操作,而不必复制数组,但在同一数组上保留两个索引。

从数组上的两个索引开始。如果元素不为零,则不要将其复制到新数组中,而应将其保留在原处并增加两个索引。当您达到零时,仅增加一个索引。现在,如果两个索引不相同,并且您未查看0,则将当前元素替换为落后的索引位置(由于遇到0)。在这两种情况下,只要当前元素不为0,就增加另一个索引。

它看起来像这样:

int max = arr.length;
for (int i = 0, int j = 0; j < max; j++) {
  if (arr[j] != 0) {
    if (i < j) {
      swap(arr, i, j);
    }
    i++
  }
}

运行此:

{ 1, 2, 0, 0, 0, 3, 4, 0, 5, 0 }

产量:

{ 1, 2, 3, 4, 5, 0, 0, 0, 0, 0 }

我为所有好奇的人制作了一个完全可用的版本。



 类似资料:
  • 我想我这样做是完全错误的,但是我想在foreach循环运行的数组的末尾添加一个数组。 例如,这是开始结果 这是im使用的代码 期望的最终结果

  • 问题内容: 我需要获取一个字符串,并通过获取char来递归地重新排列它,并按该char的形式将字符串上的char移到末尾,例如“ Hello world!”。,’l’=>“ Heo word!lll”我在理解递归思维方式时遇到了问题,所以我从这里开始: 谢谢您的帮助 :) 问题答案: 递归是在内部重用方法的实践。在这种情况下,我将提供一个解决方案来解释发生的情况: 如果执行: 这将产生所需的结果:

  • 你可以做两个动作中的一个: 1.从x=L到x=R做一个水平切割,将建筑物的高度从x=L到x=R降低1。 2.在x=P处作垂直切割,完全摧毁x=P处的建筑物,从而使其高度为零 1≤n≤1000 0≤hi≤1000 采样输入0 2 我想不出解决这个问题的方法。我的代码对以下输入不起作用:1 1 1 2 4 5 7 7 8 9**在我的代码中,我减少了所有元素的最小值。然后找出零点之间的子数组,然后比较

  • 我在Jolt转换中有一个JSON对象数组的数组,但我需要将对象向上移动到顶层数组。我尝试添加另一个Shift,但这只是将对象移到相同的位置,或者将两个子对象的值放入一个值数组中。

  • 问题内容: 我需要删除单词的第一个字母并将其移到末尾,例如: 到目前为止,我已经尝试过了: 但是,我应该如何将第一个字母移到末尾? 问题答案: 您可以使用:

  • 问题内容: 我有一个像这样的DataFrame: 我想要得到的是 到目前为止,这是我的方法。 有没有有效的方法来实现这一目标?这是减慢速度的方法。谢谢您的助手!:) 我的真实数据大小 问题答案: 这是使用justify-的NumPy解决方案- 如果要节省内存,请改回分配-