将任意整数数组中的0都都放在数组最后

这篇博客介绍了一个Java算法,用于将任意整数数组中的0元素移动到数组末尾,同时保持非0元素的顺序不变。算法通过找到第一个0元素的下标k,然后遍历寻找k之后的第一个非0元素,交换两者位置,直到所有0元素移至末尾。输入是用逗号分隔的一串整数,输出是调整后的数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:从键盘任意输入一个整数数字,将此整数数组中所有包含的0都放在数组的最后,非0项顺序不变(Java实现)

算法描述:   1.首先要先找到此数组中的第一个为0项,并将此项下标值赋给k,再找到k后的第一个非0项,并将此项的下标值
  赋给i,此时,调换下标为K和i的数组的两个值,例如,6,3,0,0,7,0中,第一个0项的下标为k,此时k=1,i=2,将
  k和i的值对调,新数组即变为6,3,0,0,0,7,0;此时将k值加1,即将k向后移一位,再将i值进行循环,找到k后的
非0值,即7,此时k=2,i=5,将k和i所对应的值对调,即得到新数组:6,3,7,0,0,0,0。依次类推,直至将所有
  的0全部移植数组的末尾。

输入描述:请输入一串整数并在输入时用英文逗号隔开:
6,0,3,0,0,7,0
程序输出: 6,3,7,0,0,0,0
程序源码:

/**************************************************************     
* Copyright (c) 2016,          
* All rights reserved.                          
* 题目描述:从键盘任意输入一个整数数字,将此整数数组中所有包含的0都放在数组的最后,非0项顺序不变
* 输入描述:请输入一串整数并在输入时用英文逗号隔开:
* 	    6,0,3,0,0,7,0
* 程序输出:6,3,7,0,0,0,0
* 问题分析:
* 算法描述:1.首先要先找到此数组中的第一个为0项,并将此项下标值赋给k,再找到k后的第一个非0项,并将此项的下标值
* 	赋给i,此时,调换下标为K和i的数组的两个值,例如,6,3,0,0,7,0中,第一个0项的下标为k,此时k=1,i=2,将
* 	k和i的值对调,新数组即变为6,3,0,0,0,7,0;此时将k值加1,即将k向后移一位,再将i值进行循环,找到k后的
* 	非0值,即7,此时k=2,i=5,将k和i所对应的值对调,即得到新数组:6,3,7,0,0,0,0。依次类推,直至将所有
* 	的0全部移植数组的末尾。
* 	2.从键盘输入一个任意数组的方法:
* 	(1)调用java的Scanner方法,通过System.in输入一个字符串,
* 	(2)将输入的字符串用split()函数将字符串拆分成数组,
* 	(3)将字符串数组s[]中的字符串通过Integer.parseInt(s[i])转化为整数数组,并存储在arr数组中;
* 	<span style="white-space:pre">	</span>Scanner sc = new Scanner(System.in);
*		System.out.println("请输入一串整数并在输入时用英文逗号隔开:");
*		String str = sc.next().toString();
*		String s[] = str.split(",");
*		int[] arr = new int[s.length];
*		for(int i=0; i<arr.length;i++){
*			arr[i] = Integer.parseInt(s[i]);
*		}
*	3.通过Array.printSample(Array.findSample(arr));方法将数组arr传入到处理函数findSample(int[]a)中,
*		在此函数中进行数组的重新排序。
***************************************************************/
package org.marsguo.offerproject;

import java.util.Scanner;
class Array{
	public static int k = 0;							//将k指向数组中的第一位
	public static int[] findSample(int[] a){			//数组处理函数;查找出数字0并放在数字末尾
		while(a[k] != 0){								//找到数组中的第一个0所在的下标
				k++;
		}
		for(int i = k+1; i < a.length;i++){				//将i指向数组中k后的一位
			if(a[k]==0){								
				if(a[i]!=0)								//找到k后第一个非0的数字。
				{
					a[k]=a[i];							//找到k后第一个非0项后,将此值和第一个0(即k所指的数字)调换
					a[i]=0;
					k++;								//k值加1,向后移一位
				}
			}
		}
		return a;										//返回重新排序后的数组
	}
	public static void printSample(int a[]){			//打印重新排序后的数组
		System.out.println("排序后的结果是:");
		for(int j = 0; j<a.length;j++){
			System.out.print(a[j] + ",");
		}
	}
}

public class Arr_sort{
	
	public static void main(String args[]){
		Array array = new Array();     			  //声明一个Array类的array对象
		Scanner sc = new Scanner(System.in);	 //调用Scanner方法,输入
		System.out.println("请输入一串整数并在输入时用英文逗号隔开:");
		String str = sc.next().toString();
		String s[] = str.split(",");					//将输入的字符串用","分开,并存放到字符串数组s[]中
		int[] arr = new int[s.length];					//声明一个和s同长度的数组arr
		for(int i=0; i<arr.length;i++){					
			arr[i] = Integer.parseInt(s[i]);			//将字符串数组转化成整形数组
		}
		
		/*因为findSample()方法和printSample()方法为静态方法,所以可以直接使用类名.方法名来调用
		而不需要声明对象。静态方法在对象创建前就已经存在了*/
		//Array.findSample(arr);		
		Array.printSample(Array.findSample(arr));
		/*也可以为:
		array.findSample();
		array.printSample();
		此时会提示警告:The static method findSample() from the type
		Array should be accessed in a static way*/
	}
}

程序输出结果:



总结:1,在类中不能直接使用for语句或者if语句进行处理,要先声明方法,在方法中使用if或for,否则报错for语言前的分号“;”有问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值