排序(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下一題吧)