地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=11
奇偶数分离
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
有一个整型偶数n(2<= n <=10000),你要做的是:先把1到n中的所有奇数从小到大输出,再把所有的偶数从小到大输出。
-
输入
-
第一行有一个整数i(2<=i<30)表示有 i 组测试数据;
每组有一个整型偶数n。
输出
-
第一行输出所有的奇数
第二行输出所有的偶数
样例输入
-
2 10 14
样例输出
-
1 3 5 7 9 2 4 6 8 10 1 3 5 7 9 11 13 2 4 6 8 10 12 14
-
-
第一行有一个整数i(2<=i<30)表示有 i 组测试数据;
这道题的第一个想法是:太简单了,直接一个for循环,然后判断奇数和偶数,然后存储再输出来。第二个考虑的是用什么存储呢?
此时第一个想法是用String str="",直接 str+=i; 然后就完事了。但是想起一次蓝桥杯的比赛,我正式用String来处理本身是数字的情况,结果好久都没有出来。连续做了几道题,到回来看的时候,还是没有出现,再加上String的存储也是有范围的,一直都没有留意,一直觉得简单就完事了,当时还抛出异常。
String的最大长度:http://www.blogjava.net/killme2008/archive/2009/01/15/251368.html
就这道题,用String和数组实现,发现两个耗时和内存占用方面,是两个不同的级别。看来想要简单,还是要付出代价的。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
while(n-->0){
int length=sc.nextInt();
new Main().intSort(length);
}
}
/**
* 耗时+内存:874 4306
*/
public void strSort(int length){
String strA="",strB="";
for(int i=1;i<=length;i++){
if(i%2==0)
strB+=i+" ";
else
strA+=i+" ";
}
System.out.print(strA+"\n"+strB+"\n");
}
/**
* 耗时+内存:127 1822
*/
public void intSort(int length){
int[] odd=new int[length/2+1]; //都加上1,这样无论是奇数还是偶数都保险,不会溢出
int[] even=new int[length/2+1];
int oddTmp=0,evenTmp=0;
for(int i=0;i<=length;i++){
if(i%2==0)
even[evenTmp++]=i;
else
odd[oddTmp++]=i;
}
for(int x:odd)
if(x!=0)
System.out.print(x+" ");
System.out.println();
for(int y:even)
if(y!=0)
System.out.print(y+" ");
System.out.println();
}
}
很明显
耗时+内存:874 4306 一个:耗时+内存:127
1822 差得太远了。