`
MouseLearnJava
  • 浏览: 467251 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[Java小程序] 将所有数值为0的元素置于数组最后

阅读更多
本文实现一个Java小程序: 将所有数值为0的元素置于数组最后。

例如:

移动前: [1, 3, 0, 3, 1, 4, 5, 0, 3, 1, 0, 2, 3, 1, 9, 8, 2, 2, 5, 2]
移动后: [1, 3, 3, 1, 4, 5, 3, 1, 2, 3, 1, 9, 8, 2, 2, 5, 2, 0, 0, 0]

如果数组中没有需要移动的数,那么就保持不变。

思路:

1. 定义一个与给定数组长度等长的整形数组,同时定义一个名为nonZerosCount的整形变量,用于统计不为0的元素个数。

2. 循环遍历给定的整形数组,如果该元素不为0,则将该位置的元素数值放置到目标数组上去,目标数组上的位置由变量nonZerosCount的值决定。

基于这两点,写出方法,如下:

public int[] moveZerosToEnd(int[] data) {
		/**记录一个当前不为零的数字个数*/
		int nonZerosCount = 0;
		int[] result = new int[data.length];
		
		for(int i=0;i<data.length;i++)
		{
			if( 0 != data[i])
			{
				result[nonZerosCount++] = data[i];
			}
		}
		
		/*
		 * 如果不为0的数字个数小于数组的长度,那么将剩余数组中的元素赋值为0。
		 * 
		 *  因为整形数组元素的默认值是0,其实下面的步骤可以省略。
		 */
		
		int length = data.length;
		while(nonZerosCount < length)
		{
			result[nonZerosCount++] = 0;
		}

		return result;
	}


这样,将所有值为0的元素放置到数组最后面的功能就实现了。

接下来,再实现一个方法,可以指定一个数字Num,然后将所有值为Num的的元素放置在数组的最后面。

public int[] moveNumToEnd(int[] data, int numToMove) {
		/**记录一个当前不为numToMove的数字个数*/
		int nonZerosCount = 0;
		
		int[] result = new int[data.length];
		
		for(int i=0;i<data.length;i++)
		{
			if( numToMove != data[i])
			{
				result[nonZerosCount++] = data[i];
			}
		}
		
		
		/*
		 * 剩余元素的组都是numToMove
		 */
		int length = data.length;
		while(nonZerosCount < length)
		{
			result[nonZerosCount++] = numToMove;
		}

		return result;
	}



完整代码和测试结果如下:

public class MoveNumsToEndExample {
	
	/**
	 * 返回一个指定长度和范围的随机数组。
	 * 
	 * @param seed
	 * @param length
	 * @return
	 */
	public int[] generateRandomNumbers(int seed, int length)
	{
		int[] randomNumbers = new int[length];
		Random ran = new Random();
		for(int i=0;i<length;i++)
		{
			randomNumbers[i] = ran.nextInt(seed);
		}
		
		return randomNumbers;
	}

	public int[] moveZerosToEnd(int[] data) {
		/**记录一个当前不为零的数字个数*/
		int nonZerosCount = 0;
		int[] result = new int[data.length];
		
		for(int i=0;i<data.length;i++)
		{
			if( 0 != data[i])
			{
				result[nonZerosCount++] = data[i];
			}
		}
		
		/*
		 * 如果不为0的数字个数小于数组的长度,那么将剩余数组中的元素赋值为0。
		 * 
		 *  因为整形数组元素的默认值是0,其实下面的步骤可以省略。
		 */
		
		int length = data.length;
		while(nonZerosCount < length)
		{
			result[nonZerosCount++] = 0;
		}

		return result;
	}
	
	public int[] moveNumToEnd(int[] data, int numToMove) {
		/**记录一个当前不为numToMove的数字个数*/
		int nonZerosCount = 0;
		
		int[] result = new int[data.length];
		
		for(int i=0;i<data.length;i++)
		{
			if( numToMove != data[i])
			{
				result[nonZerosCount++] = data[i];
			}
		}
		
		
		/*
		 * 剩余元素的组都是numToMove
		 */
		int length = data.length;
		while(nonZerosCount < length)
		{
			result[nonZerosCount++] = numToMove;
		}

		return result;
	}

}


import java.util.Arrays;

public class Main {

public static void main(String[] args) {
		
		
	MoveNumsToEndExample example = new MoveNumsToEndExample();
		
		//产生一个随机整数数组
		int[] randomNumber = example.generateRandomNumbers(10, 20);
		
		System.out.print("Before moving zeros  -->");
		System.out.println(Arrays.toString(randomNumber));
		
		System.out.print("After  moving zeros  -->");
		
		//移动所有的0到最后
		System.out.println(Arrays.toString(example.moveZerosToEnd(randomNumber)));
		
		//移动所有的1到最后
		System.out.print("After  moving ones   -->");
		System.out.println(Arrays.toString(example.moveNumToEnd(randomNumber,1)));
		
		//移动所有的8到最后
		System.out.print("After  moving eights -->");
		System.out.println(Arrays.toString(example.moveNumToEnd(randomNumber,8)));
		
		
	}
}


某一次运行的结果如下:
Before moving zeros  -->[3, 9, 1, 5, 2, 1, 3, 3, 8, 1, 8, 6, 5, 9, 8, 0, 0, 6, 0, 4]
After  moving zeros  -->[3, 9, 1, 5, 2, 1, 3, 3, 8, 1, 8, 6, 5, 9, 8, 6, 4, 0, 0, 0]
After  moving ones   -->[3, 9, 5, 2, 3, 3, 8, 8, 6, 5, 9, 8, 0, 0, 6, 0, 4, 1, 1, 1]
After  moving eights -->[3, 9, 1, 5, 2, 1, 3, 3, 1, 6, 5, 9, 0, 0, 6, 0, 4, 8, 8, 8]


转载请注明出处: http://mouselearnjava.iteye.com/blog/1986495
0
0
分享到:
评论
2 楼 MouseLearnJava 2013-12-08  
znfsky 写道
要这么复杂?一头一尾两个指针,一个向后一个向前,遇到0和非0时交换数据不就可以了吗?


这样做是一种方法,但是并不能保证原有非零数字在数组中的顺序。
1 楼 znfsky 2013-12-07  
要这么复杂?一头一尾两个指针,一个向后一个向前,遇到0和非0时交换数据不就可以了吗?

相关推荐

    中兴JAVA面试题目

    下面,我们将详细解析文件中的部分知识点,包括但不限于编译Java应用程序、基本数据类型、运算符、控制结构、方法定义、类与对象的概念、异常处理等。 ### 编译Java Application Java源代码文件以`.java`为扩展名...

    java面试题

    - 选项:(A) 环境变量可在编译source code时指定 (B) 在编译程序时,所能指定的环境变量不包括classpath (C) javac一次可同时编译数个Java源文件 (D) javac.exe能指定编译结果要置于哪个目录(directory) ...

    JAVA小游戏2048需求分析.doc

    + 先将所有值为0的数移至行首 + 能后从行尾开始逐一和前一个数比较,如果相等则合并这2个格子 * 每合并一次格子,将其值累计到游戏总分中 * 一次移动结束后,在所有值为0的方格中随机的分配一个2/4的值 * 所有方格...

    JAVA语言程序设计期末考试题及答案.pdf

    7. 数组操作和条件判断:给定的代码片段中,只对奇数位置的数组元素求和,结果为120。 8. Java的继承特性:单个类只能继承一个父类,但可以通过实现多个接口来达到多重继承的效果。 三、程序运行结果: 1. `...

    java 面试题

    解析:循环执行一次后,a变为-1,不再满足while条件,因此循环停止,最后c的值为-1。 7. 下列哪一种叙述是正确的? 正确答案:D.声明抽象方法不可写出大括号 解析:抽象方法没有方法体,只有方法签名,不需要大...

    华为java面试题

    - **解释**:Java程序主要有三种类型:应用程序(Application)、小程序(Applet)和服务器端应用(Servlet)。因此,正确答案是B:Applet、C:Application、D:Servlet。 #### 2. 编译环境变量 - **知识点**:编译...

    最新华为java笔试题

    - **解析**: 数组在 Java 中确实被视为对象,但并不是原生类。数组的大小一旦定义就不能更改,因此选项 c 的定义方式是错误的。 5. **不能用来修饰 interface 的有()** - **选项**: a.privateb.publicc.protected...

    194道C语言复习练习题及答案.pdf

    循环中`i`的值分别为0、1、2,对应的数组元素分别为`x[0][2]`、`x[1][1]`、`x[2][0]`,即3、5、7。 #### 题目20: 条件分支语句 **题目:** 有如下程序,运行后的输出结果是【】。 ```c main(){ int a = 10, b = 4, ...

    Java练习题

    10. **异常抛出**:程序可以抛出自定义异常,也可以抛出内置的Java异常。 11. **import语句**:`import`语句用于导入特定的类,这里的`Applet`代表一个类。 12. **引用数据类型**:数组、类和接口都属于引用数据...

    计算器java课程设计完整版.pdf

    1. **框架与布局**:计算器应用程序基于JFrame构建,主容器使用BorderLayout,文本框置于"North"区域,按钮面板(JPanel)置于"Center"区域,采用GridLayout进行布局。 2. **事件监听**:按钮事件处理主要在...

    2021-2022计算机二级等级考试试题及答案No.12096.docx

    这是因为在C语言中,如果数组初始化列表中的元素少于数组的总大小,那么剩余的元素将被自动填充为0。 ### 2. Windows的目录结构 **知识点概述:** Windows操作系统采用树形结构来组织文件和目录。 **详细解释:**...

    [Android研发工程师笔试题目]网络工程师笔试题目.docx

    2. Java 程序经编译后会产生 byte code,而不是 machine code。 3. Java 语言的 constructor 必须与 class 同名,但方法不能与 class 同名。 二、面向对象编程 1. 类中的 constructor 不可省略,但可以有多个 ...

    华为笔试试题

    因此,正确答案是B(在编译程序时,所能指定的环境变量不包括classpath)、C(javac一次可同时编译数个Java源文件)、D(javac.exe能指定编译结果要置于哪个目录)。 **3. 下列标识符不合法的有()** - **解析:**...

    2021-2022计算机二级等级考试试题及答案No.12967.docx

    因此,即使在实际使用中不需要,也应当确保字符数组的最后一个字符为`'\0'`。 ### 22. 创建宏时的必要元素 - **知识点概述**:创建宏时必须定义的元素。 - **详细解释**:在创建宏的过程中,需要定义宏名、宏操作...

    2021-2022计算机二级等级考试试题及答案No.10081.docx

    1. **数组赋值**:使用 `ARR = 3` 对一个已声明的数组赋值,将会把数组的所有数值元素赋值为 3。 ### CardLayout 布局管理器特性 1. **CardLayout 特性**:CardLayout 布局管理器能够将界面视为一系列卡片,一次仅...

    2021-2022计算机二级等级考试试题及答案No.5175.docx

    16. Java日期类库:Date、Calendar和DateFormat类确实位于`java.util`包中,但该表述可能源于较早版本的Java,因为从Java 8开始,日期和时间API已被更新,新引入了`java.time`包。 17. 乘法和取整运算:在某些编程...

    2021-2022计算机二级等级考试试题及答案No.9675.docx

    6. Java数据类型转换:在Java中,`Integer.parseInt("12")`将字符串转换为整数类型变量,`Integer.valueOf("12").intValue()`同样如此,因此a和b都是整数类型变量且值相等。 7. HTTP协议:HTTP是HyperText Transfer...

    2021-2022计算机二级等级考试试题及答案No.13032.docx

    18. `Val`函数在VBScript中用于将字符串转换为数值,如果字符串包含非数字字符,`Val`函数会忽略这些字符,所以`Val("123ab")`的结果是`123`。 19. Java的反汇编命令是`javap`,它可以用来查看Java字节码。 20. ...

    2021-2022计算机二级等级考试试题及答案No.1070.docx

    - **解析**: 题目中的Java程序尝试访问一个未显式初始化的数组的第一个元素。在Java中,对于整型数组,如果没有显式初始化,则数组元素默认初始化为0。因此,输出的结果是0。选项C(输出零)正确。 - **扩展**: 对于...

Global site tag (gtag.js) - Google Analytics