文章目录

  • 1. 题目
    • 1.1. 输入
    • 1.2. 输出
  • 2. 算法一
    • 2.1. 分析
    • 2.2. 代码
    • 2.3. 结果
  • 3. 算法二
    • 3.1. 分析
    • 3.2. 代码
    • 3.3. 结果
  • 4. 非零元素移动到数组后端

1. 题目

现有一个一维数组 a = [ 1 , 0 , 2 , 7 , 0 , 0 , 0 , 5 , 0 , − 3 ] a = [1, 0, 2, 7, 0, 0, 0, 5, 0, -3] a=[1,0,2,7,0,0,0,5,0,−3],你需要将数组中非零元素移动到数组的前端,零元素在数组的后端。

1.1. 输入

一个一维数组 a = [ 1 , 0 , 2 , 7 , 0 , 0 , 0 , 5 , 0 , − 3 ] a = [1, 0, 2, 7, 0, 0, 0, 5, 0, -3] a=[1,0,2,7,0,0,0,5,0,−3];

1.2. 输出

a = [ 1 , 2 , 7 , 5 , − 3 , 0 , 0 , 0 , 0 , 0 ] a = [1, 2, 7, 5, -3, 0, 0, 0, 0, 0] a=[1,2,7,5,−3,0,0,0,0,0];

2. 算法一

2.1. 分析

看到题目的第一想法就是,用另外一个和 a a a 等长度的数组来保存这些非零元素。

2.2. 代码

public class Solution
{/*** 一维数组中的非零元素前移.** @param array 一维数组.* @return 非零元素前移后的一维数组.*/public static int[] nonZeroElementsMoveForward(int[] array){// 边界检查if (array == null || array.length == 0)return array;// 创建一个和 array 等长的数组,自动初始化为 0.int[] changedArray = new int[array.length];// 非零元素 array[i] 放入 changedArray 中的第 j 个位置.for (int i = 0, j = 0; i < array.length; ++i)if (array[i] != 0)changedArray[j++] = array[i];return changedArray;}/*** 程序的入口.* * @param args 接收系统的参数*/public static void main(String[] args){int[] array = {1, 0, 2, 7, 0, 0, 0, 5, 0, -3};System.out.println(Arrays.toString(array));array = nonZeroElementsMoveForward(array);System.out.println(Arrays.toString(array));}
}

2.3. 结果

3. 算法二

能不能不创建新的数组,直接在原数组上进行操作呢?

3.1. 分析

在此基础上进行分析:
输入中的元素 2,向前移动了 1 位,占据的是第一个 0 的位置(0 元素的位置是空闲的);
输入中的元素 7,向前移动了 1 位,占据的是上一个元素 2 空出来的位置(因为元素 2 向前移动了 1 位,所以这个位置空了出来);
输入中的元素 5,向前移动了 4 位,占据的是上一个元素 7 空出来的位置(因为元素 7 向前移动了 1 位,所以这个位置空了出来);
……

好像有一点点规律了。
当遍历到数组中的非零元素的时候,假如知道上一个空闲位置就好了!!!

额外的一个指针就可以实现这样的功能。

遍历数组的指针 i,指向空闲位置的指针为 j。
初始化,i = 0,j = 0。
i 往后遍历,当 a[i] != 0 时,将 a[i] 放入 j 指示的位置上,即 a[j] = a[i],然后 j 自增 1,指向下一个空闲位置。
不过需要注意的是,当 i 完成遍历时,j 到 i 之间的元素,需要置为零。
……

这种解法就是典型的双指针法

3.2. 代码

public class Solution
{/*** 一维数组中的非零元素前移.** @param array 一维数组*/public static void nonZeroElementsMoveForward(int[] array){// 边界检查if (array == null || array.length == 0)return;// i 遍历数组,j 指示下一个空闲位置int i, j;// 将非零的元素 array[i] 放入 j 指示的位置中.for (i = 0, j = 0; i < array.length; ++i)if (array[i] != 0)array[j++] = array[i];// i 结束遍历时,j 之后的元素需要置为 0.Arrays.fill(array, j, i, 0);}/*** 程序的入口.** @param args 接收系统的参数*/public static void main(String[] args){int[] array = {1, 0, 2, 7, 0, 0, 0, 5, 0, -3};System.out.println(Arrays.toString(array));nonZeroElementsMoveForward(array);System.out.println(Arrays.toString(array));}
}

3.3. 结果

4. 非零元素移动到数组后端

思想和非零元素移动到数组前端一致,只需要将 i 和 j 从数组尾部进行遍历即可。

算法题:将一维数组中的非零元素移动到数组前端(后端)相关推荐

  1. 查找二维数组中的非零元素

    手头上在做一个图像处理的工作,需要在一个二维空间中查找非零元素.网上大都是在讲如何获取非零元素的索引,总是差那么一点点,所以在其基础上进行了一个循环,以实现利用索引对元素的定位和提取: import ...

  2. 将数组中数字0元素移动到数组末尾

    将数组中的0元素移动到末尾具有很多种方法 只介绍 一种自认为好理解的方法 思想:新创建一个与原数组长度相同的数组,将原来数组中的非零元素移动过来即可,新数组中只显示原数组非零元素,其余位置为默认元素值 ...

  3. C语言试题五十三之将所有大于1小于整数m的非素数存入xx所指的数组中,非素数的个数通过k传回。

    1. 题目 请编写一个函数void function(Student a[], int n),其功能时:将所有大于1小于整数m的非素数存入xx所指的数组中,非素数的个数通过k传回. 2 .温馨提示 C ...

  4. C语言向有序数组中插入一个数使该数组仍保持有序

    C语言向有序数组中插入一个数使该数组仍保持有序 #include<stdio.h> int main() {     int n,i,j,t,k;     printf("您喜欢 ...

  5. vba 跳到下一个循环_VBA野知识分享:从一个数组中取部分值生成新数组,不使用循环的思路...

    从一个数组中取部分值生成新数组,要实现此需求通常都是采用循环的方法来完成,那有没有更简易的思路呢? 借用jscript可以实现,直接取值,不用循环.例如从100000万中元素是取8000个值出来生成新 ...

  6. 取原始数组中的指定数据push新数组

    <!DOCTYPE html> <html><head><meta charset="utf-8"><title>取原始 ...

  7. asp数组中REDIM的用法(动态数组)

    asp数组中REDIM的用法(动态数组) 动态数组里面的一个语句,只能出现在过程里面,可以多次使用.可以改变数组大小,和维数 格式: REDIM [Preserve] 数组名(下标1[下标2....] ...

  8. 数组中哪些常用方法会修改原数组

    一.不会改变原来数组的有: concat() concat() 方法用于连接两个或多个字符串. 该方法没有改变原有字符串,但是会返回连接两个或多个字符串新字符串. every() every() 方法 ...

  9. 【JS实战】移除数组中的元素(返回新的数组)

    移除数组中的元素(返回新的数组) 方法一:for循环+push function remove(arr, item) {let newArr = [];for(let i = 0; i < ar ...

最新文章

  1. 从头开始学习Adobe Photoshop CC图像编辑
  2. java ee s2sh复习题_JavaEESSH框架答案试题题目及答案,期末考试题库,章节测验答案...
  3. 数据可视化组队学习:《Task01 - Matplotlib初相识》笔记
  4. android 通过类名跳转activity,Activity跳转方式总结
  5. 后端技术:Mybatis是如何解析配置文件的?
  6. react学习(15)---antdesign form两种验证
  7. excel导入sqlserver数据库大数据量,可每秒控制数量
  8. java linux runtime 正则表达式_Java学习之正则表达式
  9. 落户北京经开区 小米汽车首车预计2024年下线并量产 网友:开始存钱!
  10. 69期-Java SE-007_面向对象-1-001-002
  11. mongodb 常用操作(转)
  12. [自测]linux运维100题目(阿里巴巴内部题目)
  13. 基于MIMO讲解信道估计基本原理
  14. 不需要手机号,怎样注册邮箱账号
  15. [导入]WAP常见问题问答大全---七、关于WAP浏览器的常见问答
  16. 教你学会u盘重装win10系统,u盘系统盘安装win10
  17. Oracle常用函数(zzl)
  18. 六方ZnS包裹碳纳米管复合粉体/PbS纳米晶原位包裹碳纳米管的复合材料/壳聚糖包裹的多壁碳纳米管
  19. 【计算机网络】数据链路层的差错控制 - 循环冗余校验(CRC)
  20. M1芯片MacBook通过Docker安装Kali

热门文章

  1. Revenge Storm高帮 x_REVENGE x STORM 闪电风暴 再次席卷而来
  2. 怎么精炼java代码_网页播放器开发(四)代码精炼提纯(示例代码)
  3. 热门好用的手机号码归属地API,更新及时、准确
  4. GNSS、RTK、基站、移动站
  5. 劈尖等厚干涉条纹matlab,劈尖等厚干涉实验条纹不等间距的分析
  6. html拖动圆纽改变,绘制一个可拖动的圆圈,其中心信息使用easeljs动态更改 - html5代码 - 源码查...
  7. 关于使用map,for等遍历数组获取其中每一项的值在调用接口只取到最后一个值的问题
  8. 诺基亚S60第二版与第三版的系统技术区别
  9. 更改Windows 7中WMP12默认的视频解码器
  10. CSP 2019Day2T2 划分部分题解