排序(hdu 1.3.6)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5799 Accepted Submission(s): 1664
Problem Description
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
Output
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
Sample Input
0051231232050775
Sample Output
0 77 12312320
这是杭电的一道基础水题,其实看起还是比较简单的,就是将5作为分隔符号对字符串进行划分,对取得的Integer整数进行排序输出,考虑的情况无非就是以下几种
1、开头是5,结尾是5
2、开头是5,结尾不是5
3、开头不是5,结尾是5
4、开头不是5,结尾也不是5
其实也是很简单的操作,我想的用c语言的操作实现(虽然我用的是java,但我放弃了使用java的STL,转而想用c语言的方式去思考这个问题),很快我就写出了下面的代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
/**
*
* @author chaplinJ
*
*/
public class Main5{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String st;
char[] chars;
int[] location;
List<Integer> list;;
int count = 0;
String values;
while(sc.hasNext()){
st = sc.next();
chars = st.toCharArray();
location = new int[chars.length+1]; //记录位置数组
count=0;
list = new ArrayList<Integer>();
//初始化位置
for(int i = 0 ; i < chars.length+1;i++){
location[i] = -1;
}
for(int i = 0 ; i < chars.length;i++){
if(chars[i] == '5'){
location[count++] = i; //记录位置
}
}
if(location[0] != -1){ //判断是否包含5分隔符号
if(chars[0] != 5){//判断5是否出现在第一个位置
values = String.valueOf(chars, 0, (location[0]));
if(!"".equals(values)){
list.add(Integer.parseInt(values));
}
}
for(int i = 0 ; i < location.length - 1 && location[i] != -1;i++){
if( location[i] + 1 <= location[i+1] - 1){ //两个5不相邻
values = String.valueOf(chars, location[i] + 1, (location[i+1] - location[i] - 1));
// System.out.print((location[i] + 1) + " " + (location[i+1] - 1));
if(!"".equals(values)){
list.add(Integer.parseInt(values));
}
}
}
if(location[count - 1] != chars.length -1){ //判断5是否出现在最后一个位置
values = String.valueOf(chars, location[count - 1] + 1, chars.length - location[count - 1] - 1);
// System.out.print((location[i] + 1) + " " + (location[i+1] - 1));
if(!"".equals(values)){
list.add(Integer.parseInt(values));
}
}
}
Collections.sort(list);
// for(int i = 0 ; i < list.size();i++){
// System.out.print(list.get(i)+" ");
// }
for(int i=0;i<list.size();i++)
{
int a = list.get(i);
System.out.print(a);
if(i!=list.size()-1)
System.out.print(" ");
else
System.out.println();
}
}
}
}
感觉很开心,hdu OJ去提交,结果出现了WA,没错就是WA!!!!! 真的是不可思议啊!我改过来改过去,依然是WA!,自己想到的情况在自己的电脑能够AC过,但hdu OJ总是WA ,就这样纠结了一下午,至少提交了6次!!,WA依旧,,,,,硬撑着我到了其它OJ平台,也通不过,最后到了牛客上去测试,竟然过了!,天啦噜!,现在我也没想明白,这也是我为什么为这道水题写这篇文章的原因。
不过就不过吧!我还是随随java的类库,大众化一点!,循环去掉头部的’5’,最后采用通用的正则表达式分割!最终有了以下的代码(这也是我百思不得其姐没办法的情况下。。。。)
package acm.hdu.edu.cn;
import java.util.Arrays;
import java.util.Scanner;
/**
*1.3.6
* @author chaplinJ
*
*/
public class Main5{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String st;
String[] values;
int[] vas;
while(sc.hasNext()){
st = sc.next();
while(true){
if(st.charAt(0) == '5'){
st = st.substring(1);
}else{
break;
}
}
values = st.split("5+");
vas = new int[values.length];
for(int i = 0 ; i < values.length;i++){
vas[i] = Integer.parseInt(values[i]);
}
Arrays.sort(vas);
for(int i = 0 ; i < vas.length;i++){
System.out.print(vas[i]);
if( i!= vas.length - 1){
System.out.print(" ");
}else
System.out.println();
}
}
}
}
以此纪念我的六次 WA!
(懵逼,还是不知道哪里有问题,头疼,先放一放,,,继续AC下一题吧)