题目描述:从键盘任意输入一个整数数字,将此整数数组中所有包含的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语言前的分号“;”有问题。